【发布时间】:2015-08-25 15:04:29
【问题描述】:
假设object 是类C 的一个实例。还假设object 附加了一个特定于实例的方法m。方法m 定义在C 及其超类C0 中。问题是,表达式应该使用哪种方法
super m
当 self == 对象时调用,为什么?
我看到了两个可能的答案:
- C >> #m(对象类中的方法)
- C0 >> #m(对象类超类中的方法)
编辑
尽管我们实现特定于实例的行为的方式与 super 的语义无关,但我要指出,我最喜欢的实现是将所谓的 MethodDictionaryArray(或 MDA短)在对象标题中,而不是对象类中。可以想象,MDA 包含继承链的方法字典。
通过此实现,您可以将实例行为放在新的MethodDictionary (MD) 中,并将对象的 MDA 重新定义为嵌套数组 #{MD. MDA}。
【问题讨论】:
-
请澄清继承链。 Smalltalk 中没有实际的“特定于实例”的方法(至少不是我知道的那些),因为行为总是在类中定义的。特定于实例的方法的工作方式是将对象的类更改为其前类的匿名子类(我们在 Squeak 中称其为“uniclass”)。
-
@BertFreudenberg 请注意我添加的 EDIT。
-
Leandro,我认为您已经阅读了this question 的答案?
-
@AmosM.Carpenter 是的,我之前读过它。您认为那里有一些提示可以帮助解决我的问题吗?
-
@LeandroCaniglia 是的,我认为已接受答案中的几个链接可能会有所帮助。我对仅在特定情况下更改方法不太熟悉,因此我自己无法提供答案。但是 Hernan 对这个问题的回答,尽管对大众来说更多,但应该可以帮助您设置一个测试用例来回答您自己的问题。
标签: smalltalk