【问题标题】:How should super behave with instance-specific behavior?super 应该如何处理特定于实例的行为?
【发布时间】:2015-08-25 15:04:29
【问题描述】:

假设object 是类C 的一个实例。还假设object 附加了一个特定于实例的方法m。方法m 定义在C 及其超类C0 中。问题是,表达式应该使用哪种方法

super m

当 self == 对象时调用,为什么?

我看到了两个可能的答案:

  1. C >> #m(对象类中的方法)
  2. C0 >> #m(对象类超类中的方法)

编辑

尽管我们实现特定于实例的行为的方式与 super 的语义无关,但我要指出,我最喜欢的实现是将所谓的 MethodDictionaryArray(或 MDA短)在对象标题中,而不是对象类中。可以想象,MDA 包含继承链的方法字典。

通过此实现,您可以将实例行为放在新的MethodDictionary (MD) 中,并将对象的 MDA 重新定义为嵌套数组 #{MD. MDA}

【问题讨论】:

  • 请澄清继承链。 Smalltalk 中没有实际的“特定于实例”的方法(至少不是我知道的那些),因为行为总是在类中定义的。特定于实例的方法的工作方式是将对象的类更改为其前类的匿名子类(我们在 Squeak 中称其为“uniclass”)。
  • @BertFreudenberg 请注意我添加的 EDIT
  • Leandro,我认为您已经阅读了this question 的答案?
  • @AmosM.Carpenter 是的,我之前读过它。您认为那里有一些提示可以帮助解决我的问题吗?
  • @LeandroCaniglia 是的,我认为已接受答案中的几个链接可能会有所帮助。我对仅在特定情况下更改方法不太熟悉,因此我自己无法提供答案。但是 Hernan 对这个问题的回答,尽管对大众来说更多,但应该可以帮助您设置一个测试用例来回答您自己的问题。

标签: smalltalk


【解决方案1】:

恕我直言,它应该调用C0>>m 来表现得就像C 的“正常”实例一样。如何实现特定于实例的行为的实现细节无关紧要。如果你将一个方法从C 复制到它的实例,它的行为应该和以前完全一样。

【讨论】:

    【解决方案2】:

    super 的标准定义是,super 向与 self 相同的接收者发送消息,但在定义当前方法的那个类中开始查找方法。

    【讨论】:

    • 对。但这里的重点是,该定义并不那么容易应用,因为在任何类中都没有定义特定于实例的方法。
    • 我现在明白了。然后我会认为它如下:方法的正常搜索路径是线性列表。对于特定于实例的行为,一个新的方法字典被添加到列表的开头。那么,我认为 super 意味着开始在列表中的下一个方法字典中搜索 C 类。
    • 没错。如果您在“轻量级”特定于实例的类中实现特定行为,您也会得出相同的结论,因为这样的类将是原始类的子类。但是,我们会从实现中决定语义,这就是我所质疑的。
    【解决方案3】:

    在我看来,人们可以用不同的方式来表达定义,
    以获得适当的语义解析。

    如果我们认为正常情况等价于

    '不要在搜索中包含任何定义的方法 由接收者,仅包括那些继承'

    那么我们不需要实现细节
    决定期望的答案。

    【讨论】:

    • 好点。这个定义将如何回答我的问题?
    • C类定义了m,c的实例定义了m。两者都应该被超级发送有效地“跳过”,导致 C0 >> #m(对象类超类中的方法)
    猜你喜欢
    • 1970-01-01
    • 2018-09-18
    • 2018-01-20
    • 2023-01-18
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    相关资源
    最近更新 更多