2016-05-04 6 views
4

新しいインスタンスメソッド "square"でSmallIntegerクラスを拡張しようとしています。私は "5 square"を呼び出すことができると思うので、25に戻ります。デフォルトのクラスを拡張する(SmallInteger)

インスタンスメソッドで独自のクラスを拡張することは、変数名を知っているのでかなり簡単ですが、 SmallIntegerクラスの名前。どうすればそれらを見つけることができますか?

私はそれがこのように見えるはずだと思っていますが、 'thisNumber'はこのSmallIntegerオブジェクトが何らかの数で参照されています。

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

答えて

7

Iは、GNU-Smalltalkのユーザではないですが、一般的にSmalltalkの方法の受信機は擬似変数selfで表されます。そのため、あなたの方法はSmallIntegerクラス出来上がりのインスタンス側にメソッドを追加

square 
    ^self * self 

のようになります。

しかし、既にその方法があります。そのセレクタはsquared(最後の文字として$d)です。したがって、実際にはsquareを追加する必要はありませんが、この例はもう少しスモールトークを理解するのに役立ちます。

さらに、squaredSmallIntegerに定義されておらず、Numberから継承されています。その理由は、メッセージがその階層のすべてのサブクラスで意味を持ち、それぞれの実装が同じであったために、先頭に1つだけあれば十分です(一部の方言は、パフォーマンスのためにメソッドをFractionに絞り込みます) 。

もちろん、self * selfSmallIntegerではなくLargePositiveIntegerを返すことができます。幸いなことに、Smalltalkには特別なことは何もないので、Numberを四角形にすることができ、特定のビット長に切り詰められることはありません。

+0

これはうまくいきます。ありがとう!私は実際にこの方法で「自分自身」を使用しようとしましたが、うまくいかなかった:p – Mossmyr

+1

「自分自身について」もう少し詳しく知るには、[この回答を見る](http://stackoverflow.com/a/33850249/) 4081336) –

関連する問題