Io:如何实例化子类原语(例如Number)?

时间:2012-06-06 06:12:03

标签: iolanguage

在书7 Languages in 7 Weeks中有一个问题:

  

如果分母为零,你会如何改变/返回0?

感谢线程What's the significance of self inside of a method?我有一个可行的解决方案,但我想尝试在不破坏Number“/”方法的情况下完成它,而是将子类化为Number。这是我试过的:

Zeroable := Number clone
Zeroable / = method(denom, if(denom == 0, 0, self proto / denom))

然而,这不起作用。如果我尝试实例化一个Zeroable实例,它的行为就像一个数字:

Io> ten := Zeroable 10
==> 10
Io> ten type
==> Number
Io> ten / 5
==> 2
Io> ten / 0
==> inf
Io> ten slotNames
==> list()

如果我将Zeroable实例化为“正常”方式,但它的值始终为0并且似乎没有办法改变它:

Io> zero := Zeroable clone
==> 0
Io> zero type
==> Zeroable
Io> zero / 0
==> 0
Io> zero / 2
==> 0

我认为问题是ten被实例化的方式,但我无法弄清楚如何将“参数”传递给克隆方法,或者如何创建一个不为0的Zeroable。在这儿?

1 个答案:

答案 0 :(得分:2)

无法将参数传递给克隆,克隆有效地设置如下:

clone := method(
  obj := primitiveAllocateMemory(sizeof(self))
  obj parent := self
  obj do(?init)
)

其次,你不能像那样继承Number。词法分析器遇到文字编号时会创建数字对象,并且类型为Number。此对象被设置为消息的缓存结果,这意味着,即使您拦截消息并将其评估为其他对象,您仍将获得一个数字。实际上,由于性能原因,这是消息评估的短路。

如果你想要一个不同的数字类型,你必须自己实际使用你想要的操作来实现它。这意味着继承Object(或其他一些对象)并实现您想要的所有行为。注意,如果你是Number的子类,Number上方法的实现将无法理解你的子类(它如何存储它的数字)。数字方法假定在对象中编码的数值,而不是其槽表。