Инициализировать объект с массивом
Вопрос
Я проходил (используя Squeak) Обнаружение лучшего кода: боулинг для серии Smalltalk Рона Джеффриса, и я не могу пройти через третью статью .
Создается новый класс (называемый Frame), который принимает массив в качестве аргумента в конструкторе.
Frame class>>new: anArray
^self new setRolls: anArray
Frame>>setRolls: anArray
rolls := anArray
Когда я пытаюсь запустить это в простом тесте:
testFrame
| frame rolls |
rolls := Array with: 5 with: 4.
frame := Frame new: rolls.
Я получаю следующую ошибку:
альтернативный текст http://files.getdropbox.com/u/120566 /junk/error.png р>
Как мне изменить сообщение #new, чтобы иметь возможность инициализировать объект Frame массивом?
Решение
Полагаю, вам не удалось добавить метод new: правильно в класс Frame. Вы уверены, что поместили его на стороне класса (класс Frame), а не на стороне экземпляра (Frame)? Чтобы сделать это, нажмите кнопку «класс», прежде чем добавить свой метод new:.
Другие советы
Вы действительно не хотите переопределять new:
здесь. new:
традиционно зарезервировано для " создания элемента с таким целым размером ", и меня не удивляет, что он взрывается на вас.
Более традиционное имя для нужного вам типа конструктора - fromArray:
или, возможно, даже fromCollection:
, которое, вероятно, сработало бы так, как вы хотели.