2016-05-04 3 views
4

Я пытаюсь расширить класс SmallInteger новым методом «квадрат». Идея заключается в том, что я хочу называть «5 квадратов», и она вернется 25.Расширение классов по умолчанию (SmallInteger)

Расширение собственных классов с помощью методов экземпляра довольно просто, поскольку вы знаете имена переменных, но я не знаю переменную имена в классе SmallInteger. Как я могу их найти?

Я думаю, что это должно выглядеть примерно так, но «thisNumber» ссылается на любое количество этого объекта SmallInteger.

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

ответ

7

Я не пользователь ГНУ-Smalltalk, но, как правило, в Smalltalk приемник метода представлен псевдо-переменной self. Поэтому ваш метод должен выглядеть

square 
    ^self * self 

Добавьте метод экземпляра стороны SmallInteger класса и вуаля.

Обратите внимание, что это уже есть способ, который делает это. Его селектор - squared (с последним символом $d). Таким образом, вам не нужно добавлять square, но этот пример может помочь вам понять Smalltalk немного больше.

Обратите внимание, что squared не определен в SmallInteger, но унаследован от Number. Причина в том, что сообщение имеет смысл во всех подклассах этой иерархии, и поскольку в каждом из них реализация была бы одинаковой, достаточно иметь только одну вершину (некоторые диалекты уточняют метод в Fraction ради производительности .)

Конечно, self * self может вернуть не SmallInteger, а LargePositiveInteger. К счастью, в Smalltalk нет ничего особенного, поэтому вы можете квадрат любого Number, и он не будет усечен до какой-либо определенной длины бит.

+0

Да, это работает. Благодаря! Я действительно пытался использовать «себя» таким образом, но это не помогло: p – Mossmyr

+1

Чтобы узнать немного больше о 'себе', посмотрите [этот ответ] (http://stackoverflow.com/a/33850249/ 4081336) –

Смежные вопросы