0

假设我们有oneInstancesecondInstance,其中之一SomeClass和 1OtherClass具有下面的示例类层次结构:

oneInstance
Object
 - SomeClass (some variables of it's own, nothing major)

secondInstance
Object
 - SomethingClass
 - OtherClass (just about any class in the tree here)

是否有可能在运行时更改 oneInstance 以使其“超级”消息发送到 secondInstance。

oneInstance 和 secondInstance合并本质上使 oneInstance 就像它们是一个对象一样工作,并且结构看起来好像它们是从以下内容实例化的:

secondInstance wraps around oneInstance
    Object
     - SomethingClass
     - OtherClass (just about any class in the tree here)
     - SomeClass (some variables of it's own, nothing major)

最简单的是,如果我可以super := secondInstance在 oneInstance 上分配一点,然后再改回来:D

PS。本质上,我们通过让 secondInstance 重新分类 oneInstance,因为它是“超级”,它们现在是一个对象,其状态都假定 oneInstance 是从 Object 继承而来的,没有其他状态,但它是自己的。大多数情况下,使用继承链的默认方法查找对我有利。我能找到的最接近的是对象切片https://en.wikipedia.org/wiki/Object_slicing

另一种看待它的方式是:

secondInstance 正在接收消息,它是 OtherClass 的一个实例,一切正常。它接收到的一些消息不在 OtherClass 中,因此方法查找沿着继承链向上到达 SomethingClass,然后到达 Object、ProtoObject 等,最后它们应该被转发到另一个实例。这个过程应该是完全透明的。

4

1 回答 1

1

首先,在 Pharo 和 Squeak(以及大多数 Smalltalks)中,你总是在运行时。所以很明显,如果它可以做某事,它可以在“运行时”做。:)

通常,“常规代码”的元功能会导致真正具有欺骗性的代码难以调试,对您和其他人来说都是如此。因此,实现#doesNotUnderstand: 和使用#respondsTo: 等通常是“糟糕的风格”,除非你真的必须做这些事情。

透明转发器对象的一个​​明显示例是 OODBS 的代理 - 但确实没有很多好的示例。

但要更准确地回答 - 在您的#doesNotUnderstand 实施中: - 只需查询是否self respondsTo: aMessage selector(或类似)并根据此决定是否委托。

于 2015-09-22T07:40:05.213 回答