【问题标题】:Pharo Smalltalk - Is it possible to assign super to some other instance after the Object has been instantiated?Pharo Smalltalk - 实例化对象后是否可以将 super 分配给其他实例?
【发布时间】:2015-09-17 13:03:55
【问题描述】:

假设我们有oneInstancesecondInstanceSomeClassOtherClass 之一,示例类层次结构如下:

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的。 “运行时”是指在对象被实例化之后。修改了问题以反映这一点。
猜你喜欢
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
相关资源
最近更新 更多