Как иметь переменную экземпляра, которая является массивом

Я хотел бы создать приложение 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 абстрактным классом, и поэтому вам нужно создать экземпляр его подкласса, чтобы получить массив фиксированного размера.

Другие вопросы по тегам