扩展默认 类 (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 非 SmallInteger
而 LargePositiveInteger
。幸运的是,在 Smalltalk 中没有什么特别的,所以你可以对任何 Number
进行平方,它不会被截断为任何特定的位长度。
我正在尝试使用新的实例方法 "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 非 SmallInteger
而 LargePositiveInteger
。幸运的是,在 Smalltalk 中没有什么特别的,所以你可以对任何 Number
进行平方,它不会被截断为任何特定的位长度。