扩展默认 类 (SmallInteger)

Extending default classes (SmallInteger)

我正在尝试使用新的实例方法 "square" 扩展 SmallInteger class。我的想法是我希望能够调用“5 square”,它会 return 25.

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

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

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

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

square
  ^self * self

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

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

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

当然,self * self 可以 return 非 SmallIntegerLargePositiveInteger。幸运的是,在 Smalltalk 中没有什么特别的,所以你可以对任何 Number 进行平方,它不会被截断为任何特定的位长度。