Как иметь переменную экземпляра, которая является массивом
Я хотел бы создать приложение smalltalk с классом, который имеет переменную экземпляра, которая является массивом, и переменную экземпляра, которая является размером массива. В идеале я хотел бы инициализировать их, когда объект создается, но у меня они инициализируются вручную в методе.
Вот мой код:
Object subclass: Student [
| numTests marks |
initialize [
numTests := 0.
marks := Array new: 10.
]
]
student := Student new.
student initialize.
Но я получаю следующую ошибку:
Object: Array new: 10 "<0x10b054b80>" error: method is responsibility of a subclass
Как я могу решить эту проблему?
1 ответ
Возможно, вы не хотите этого делать. Я обычно использую производные Squeak и Array new: работает, но часто это не то, что вам нужно, потому что массивы имеют фиксированный размер (то есть вы не можете добавлять или удалять элементы), и поэтому вместо них обычно используется что-то вроде OrderedCollection. Кроме того, вы обычно не хотите хранить размер в ivar, а скорее отправляете #size в свою коллекцию всякий раз, когда вам нужно знать, сколько элементов она содержит.
Я изменил ваш пример кода на основе приведенных выше предложений (также обратите внимание, что вам не нужно явно отправлять #initialize, это делается для вас через #new:):
Object subclass: Student [
| marks |
initialize [
marks := OrderedCollection new: 10.
].
addMark: newMark [
marks add: newMark
].
removeMarkAt: markIdx [
marks removeAt: markIdx
].
size [
^ marks size
]
]
student := Student new.
Если вам действительно нужно создать массив фиксированного размера, обновите вопрос, с каким вариантом Smalltalk вы используете, чтобы кто-то, обладающий конкретными знаниями о реализации, мог помочь. Проблема, с которой вы, похоже, сталкиваетесь, заключается в том, что ваша реализация Smalltalk считает Array абстрактным классом, и поэтому вам нужно создать экземпляр его подкласса, чтобы получить массив фиксированного размера.