0

パラメータのクラスに従って、Smalltalk でメソッドをオーバーロードできないことはわかっています。この設計上の問題が残っています:

Mail を実装するクラス、Sentence を実装するクラス、Word を実装するクラスの 3 つのクラスがあります。これら 3 つのクラスには、String を引数として受け取る addContent というメソッドがあります。Mail と Sentence には Word を受け取る addContent という別のメソッドがあり、Mail には Sentence を受け取る別の addContent があります。側では、それらすべてに、コンテンツを文字列として返す returnAsString というメソッドがあります。

次の可能性が残されています。

  • 依存関係を介して実装します。メールには Sentence のコレクションがあり、Sentence には Word のコレクションがあります (Word には文字列だけがあります)。次に、そのコンテンツを文字列で返すようにパラメーターに要求し、オブジェクトの属性が addContent(String) を使用してそれをロードするようにすることで、その addContent を実装できます。このアプローチで私が見つけた問題は、String オブジェクトがそれ自体を String として返すメソッドを追加する必要があり、残りのメソッドは returnAsString にする必要があることです。

  • それらをすべて基本抽象クラスから継承させます。Word に Sentence を介して addContent のメソッドを持たせるため、これがどのように機能するかはわかりませんが、それは間違っています。

何か案は?

ありがとう

4

1 に答える 1

3

あなたの友達はダブルディスパッチです。

addContent:Mail、Sentence、Word の各クラスに特殊なメソッドを追加する必要があります。Mail と String の組み合わせの例を示します。

Mail >> addContent: content
    content addToMail: self

String  >> addToMail: mail
    mail addStringContent: self

Mail >> addStringContent: aString
   "here you have the explicit type encoded in the selector"
   self todo: 'Add a string to the mail"

同様に、文字列を文に追加する、単語を文に追加する、文をメールに追加するための組み合わせを修正できます。

于 2013-09-21T19:27:05.690 に答える