0

我知道您不能根据参数的类重载 Smalltalk 中的方法。我留下了这个设计问题:

我有三个类:一个实现 Mail,一个实现 Sentence,一个实现 Word。这三个类有一个名为 addContent 的方法,它接收一个字符串作为参数。Mail 和 Sentence 有另一个名为 addContent 的方法来接收 Word,Mail 有另一个 addContent 来接收 Sentence。另一方面,它们都有一个名为 returnAsString 的方法,该方法将内容作为字符串返回。

我有以下几种可能性:

  • 通过依赖项实现它们:Mail 有一个 Sentence 集合,Sentence 有一个 Word 集合(而 Word 只有一个字符串)。然后可以通过要求参数以字符串形式返回其内容来实现 addContent,并使对象的属性使用 addContent(String) 来加载它。我发现这种方法的问题是我必须为 String 对象添加一个方法以将自身作为 String 返回,而其余的方法应该是 returnAsString

  • 使它们都继承自一个基本抽象类。我只是不知道这将如何工作,因为我还让 Word 有一种通过句子添加内容的方法,这是错误的。

有任何想法吗?

谢谢

4

1 回答 1

3

你的朋友是Double Dispatch

您必须在addContent:Mail、Sentence 和 Word 的每个类上添加一个专门的方法。我给你一个邮件和字符串组合的例子。

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 回答