扩展默认类(SmallInteger)

Mos*_*myr 4 smalltalk gnu-smalltalk

我正在尝试使用新的实例方法"square"扩展SmallInteger类.我的想法是,我希望能够称之为"5平方"并且它将返回25.

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

我认为它看起来应该是这样的,但是'thisNumber'引用了这个SmallInteger对象恰好是什么数字.

SmallInteger extend [
    square [
        | r |
        r := thisNumber * thisNumber.
        ^r
    ]
]
Run Code Online (Sandbox Code Playgroud)

Lea*_*lia 7

我不是GNU-Smalltalk用户,但通常在Smalltalk中,方法的接收器由伪变量表示self.因此,您的方法应该是这样的

square
  ^self * self
Run Code Online (Sandbox Code Playgroud)

将方法添加到类的实例端SmallInteger并进行操作.

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

另请注意,它squared未定义SmallInteger但继承自Number.原因是该消息在该层次结构的所有子类中都有意义,因为在每个子类中实现都是相同的,只有一个在顶部(一些方言Fraction为了性能而改进方法). )

当然,self * self可以返回非SmallInteger但是LargePositiveInteger.幸运的是,在Smalltalk中没有什么特别的,所以你可以对任何方面进行平方Number,它不会被截断到任何特定的位长.