【发布时间】:2015-09-17 13:03:55
【问题描述】:
假设我们有oneInstance 和secondInstance,SomeClass 和OtherClass 之一,示例类层次结构如下:
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 merge 本质上使 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)
最简单的方法是,我可以在 oneInstance 上分配 super := secondInstance 一点,然后将其改回 :D
PS。本质上,我们通过让 secondInstance 重新分类 oneInstance,因为它是“超级”,它们现在是一个对象,其状态都假定 oneInstance 是从 Object 继承而来的,没有其他状态,但它是自己的。大多数情况下,使用继承链的默认方法查找对我有利。我能找到的最接近的是对象切片https://en.wikipedia.org/wiki/Object_slicing
另一种看待它的方式是:
secondInstance 正在接收消息,它是 OtherClass 的一个实例,一切正常。它接收到的一些消息不在 OtherClass 中,因此方法查找沿着继承链向上到达 SomethingClass,然后到达 Object、ProtoObject 等,最后它们应该被转发到另一个实例。这个过程应该是完全透明的。
【问题讨论】:
-
看来你正在尝试做mixins。 Squeak/Pharo 有一些实现。也许你应该那样看。就个人而言,我认为这是一个坏主意,并且会重新设计而不是试图篡改单一继承或方法查找。
-
你想达到什么目的?
-
听起来像是策略模式或状态模式:“
The object will appear to change its class.”sourcemaking.com/design_patterns/state -
@quamrana 哇,这看起来与我正在尝试做的非常相似,但有一个细节:这种模式是否允许实例同时处于多个“状态”,即同时是多个嵌套上下文的一部分?或者一旦进入上下文执行必须在另一个上下文可以执行之前结束的“状态”,“状态”变化是原子的?
-
如果你一次保持一种状态,它会更干净。通常,您的实例的客户端在同一状态下调用一系列方法,然后在定义的条件下在一个方法结束时发生状态更改。然后客户端从新状态调用更多方法,可能不知道更改。从技术上讲,没有什么可以阻止您在方法中更改状态并从那里调用更多方法,这反过来又可以更改状态等。
标签: smalltalk pharo amber-smalltalk