4

我正在尝试使用新的实例方法“square”扩展 SmallInteger 类。这个想法是我希望能够调用“5 平方”,它会返回 25。

使用实例方法扩展您自己的类相当简单,因为您知道变量名称,但我不知道 SmallInteger 类中的变量名称。我怎样才能找到它们?

我认为它应该看起来像这样,但是“thisNumber”引用了这个 SmallInteger 对象恰好是的任何数字。

SmallInteger extend [
    square [
        | r |
        r := thisNumber * thisNumber.
        ^r
    ]
]
4

1 回答 1

8

我不是 GNU-Smalltalk 用户,但通常在 Smalltalk 中,方法的接收者由 pseudo-variable 表示self。因此你的方法应该看起来像

square
  ^self * self

将方法添加到SmallInteger类的实例端,瞧。

但是请注意,已经有一种方法可以做到这一点。它的选择器是squared$d最后一个字符)。因此,您实际上不需要添加square,但该示例可能会帮助您进一步了解 Smalltalk。

另外请注意,这squared不是在中定义SmallInteger而是继承自Number. 原因是该消息在该层次结构的所有子类中都有意义,并且由于在每个子类中的实现都是相同的,因此在顶部只有一个就足够了(某些方言Fraction为了性能而改进了该方法。 )

当然,self * self可以返回一个非但SmallInteger一个LargePositiveInteger。幸运的是,在 Smalltalk 中并没有什么特别之处,因此您可以对任何内容进行平方Number,并且它不会被截断为任何特定的位长度。

于 2016-05-04T11:42:54.773 回答