Smalltalk中的“重载”方法是否符合参数类?

时间:2013-09-21 18:35:51

标签: oop smalltalk

我知道你不能根据参数的类重载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有一个通过句子添加内容的方法,这是错误的。

有什么想法吗?

由于

1 个答案:

答案 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"

同样,您可以修复将句子添加到句子,单词到句子和句子到邮件的组合。