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

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

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

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

最佳答案

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

square
  ^self * self

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

但是请注意,已经有一种方法可以做到这一点。它的选择器是 squared($d 作为它的最后一个字符。)所以,你真的不需要添加 square 但这个例子可能会帮助你更多地理解 Smalltalk。

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

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

关于smalltalk - 扩展默认类 (SmallInteger),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37025701/

10-12 12:30