Как иметь переменную экземпляра, которая является массивом - PullRequest
0 голосов
/ 22 сентября 2018

Я хотел бы создать приложение 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 Ответ

0 голосов
/ 22 сентября 2018

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

...