206 Глава 13. Классы Triangle и NumberArray
этого, экземпляры будут обладать новым поведением. Например, они долж-
ны уметь вычислять наибольший и наименьший элемент массива, вычис-
лять сумму и произведение всех своих элементов. Это тот минимум новых
свойств, которые нам потребуются при решении основной задачи.
Начнем с метода класса, определяющего новый экземпляр. Как извест-
но, при создании нового массива с помощью сообщения new: aSize, созда-
ется экземпляр класса Array, все элементы которого равны nil. Просматри-
вая иерархию класса NumberArray, нетрудно убедиться, что все остальные
наследуемые методы создания экземпляра (например, with:) используют это
сообщение. У нас же при инициализации элементов массива должны ис-
пользоваться только числа. Поэтому надо изменить реализацию только это-
го наследуемого сообщения.
new: aSize with: aNumber
"Создает числовой набор, инициализированный числом aNumber."
^ (self basicNew: aSize) atAllPut: aNumber.
Частным случаем этого метода будет метод, по умолчанию определяю-
щий вс е элементы равными нулю:
new: aSize
"Создает числовой набор, инициализированный числом 0."
^ (self basicNew: aSize) atAllPut: 0.
Но почему все элементы набора должны быть равными? Можно при-
думать более сложные способы задания элементов. Напишем такой метод
создания нового экземпляра, который вычисляет элементы с помощью бло-
ка с одним аргументом, когда аргумент по порядку совпадает с индексом
определяемого элемента.
new: aSize accordingTo: aBlock
"Создает числовой набор, инициализированный числами,
которые получаются при выполнении одноаргументного
блока aBlock, когда его аргумент — индекс элемента."
| array |
array := self basicNew: aSize.
1 to: aSize do: [:i | array at: i put: (aBlock value: i)].
^ array.
Можно определять элемент массива и с помощью блока с двумя аргу-
ментами, первый из которых — произвольно задаваемое число, а второй —
индекс элемента. Этот метод нам пригодится при построении матриц.
new: aSize accordingTo: aBlock with: aNumber
"Создает числовой набор, инициализированный числами, которые
получаются при выполнении двухаргументного блока, его первый
аргумент — aNumber, а второй — индекс элемента."