我正在尝试使用新的实例方法“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/