Как я уже упоминал в комментарии к вашему вопросу, проблема в том, что 5 asNumber
- это 5
, что является экземпляром SmallInteger
, а не экземпляром Number
.Таким образом, когда вы initialize:
ваш класс с 5
, то, что вы получаете в иваре type
, составляет SmallInteger
.И затем, когда вы add: 5.4
, проверка становится 5.4 isKindOf: SmallInteger
, что, естественно, не удается.
Я думаю, что проблема возникает в способе, который вы выбрали для инициализации экземпляра.Более простой подход состоит в том, чтобы явно установить цель type
с помощью класса, а не экземпляра.Что-то в строках
initialize: aClass
elements := OrderedCollection new.
type := aClass
Тогда ваш пример будет выглядеть примерно так:
|myClass|
myClass:= MyClass new initialize: Number.
myClass add: 5.4.
, который будет принимать 5.4
в качестве элемента, потому что это Float
, что isKindOf: Number
.
Теперь позвольте мне добавить еще одно замечание.Обычная семантика new:
отличается от используемой вами.Аргументом new:
обычно является Integer
, и такое целое и целое выражает желаемый размер нового экземпляра.Например, вы говорите Array new: 3
, когда вы хотите Array
с 3
записями и т. Д. Не ожидается, что new:
получит другой тип параметра для построения объекта.Я не говорю, что это запрещено, просто это не обычное соглашение об именах.В вашем случае я бы предложил метод создания экземпляра, например
MyClass class >> on: aClass
^self new initialize: aClass
, и ваш код будет выглядеть так:
| sequence |
sequence := MyClass on: Number.
sequence add: 5. "ok, 5 isKindOf: Number"
sequence add: 4.5. "ok, 5.4 isKindOf: Number"
sequence add: 'hello world' "fail, not a Number"