访问派生对象的基础部分

时间:2014-12-12 18:24:06

标签: smalltalk squeak

假设我在某种方法上获得了object O

此对象O派生自基础Object BaseClass,因此具有类型为BaseClass的部分。

当我使用此方法时,如何访问此部件,这意味着super不会工作,因为我不在对象的上下文中。

谢谢!

2 个答案:

答案 0 :(得分:3)

让我重新说出你的问题,以确保我理解它。你有一个包含方法的类O(比如说“test”)。在该方法中,您希望访问属于超类BaseClass的实例变量。

如果这是正确的,那么您可以直接访问该实例变量。您只需要提供变量的名称。您的子类可以访问超类可见的所有实例变量。

您应该考虑为变量创建get和set方法,并通过从子类调用这些方法来访问变量,但它是可选的。

答案 1 :(得分:1)

让我提供另一个答案,这对于问题涉及行为(方法)而不是形状(实例变量)的情况非常有用。

假设您有两个C和D类以及C的实例c。现在假设C继承自C'并且您想调用C'中定义的方法m。已经在C中重写了。表达式c m将激活C中的实现而不是C中的实现。因为c class == C,而不是C'。正如你所说,没有"遥控"您可以从D使用的超级版本。

如果你想要的是激活C'中的方法,那么你应该在C'中移动m的源代码。另一种方法,比如m0,并在C'中重新定义m。所以它只委托给m0(^ self m0)。保持方法m在C中保持不变,然后使用m0(c m0)而不是m(c m)从D调用。

请注意,反过来说不起作用:如果你在C'中定义m0作为^ self m,表达式c m0将激活在C中找到的m的版本,而不是C'。

您还可以将C中的m0定义为^ super m,这样c m0将激活C>>> m。但是,使用不同选择器的super并不是一种好习惯,你应该选择不这样做。