我知道你不能根据参数的类重载Smalltalk中的方法。我留下了这个设计问题:
我有三个类:一个实现Mail,一个实现Sentence,另一个实现Word。这三个类有一个名为addContent的方法,它接收String作为参数。 Mail和Sentence有另一个名为addContent的方法,它接收一个Word,Mail有另一个addContent接收一个Sentence。另一方面,它们都有一个名为returnAsString的方法,它将内容作为字符串返回。
我有以下几种可能性:
通过依赖项实现它们:Mail有一个Sentence和Sentence的集合,有一个Word集合(而Word只有一个字符串)。然后可以通过要求参数在字符串中返回其内容来实现addContent,并使对象的属性使用addContent(String)来加载它。我用这种方法发现的问题是我必须为String对象添加一个方法以将其自身返回为String,其余方法应该是returnAsString
将它们全部继承为基本抽象类。我只是不知道这是如何工作的,因为我也让Word有一个通过句子添加内容的方法,这是错误的。
有什么想法吗?
由于
答案 0 :(得分:3)
你的朋友是Double Dispatch。
您必须在每个类Mail,Sentence和Word上添加专门的addContent:
方法。我给你的组合邮件和字符串的例子。
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"
同样,您可以修复将句子添加到句子,单词到句子和句子到邮件的组合。