如何具有数组的实例变量

时间:2018-09-22 15:05:58

标签: arrays smalltalk gnu-smalltalk

我想用一个类创建一个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 :(得分:6)

您可能真的不想这样做。我通常使用Squeak派生函数和Array new:可以工作,但通常不是您想要的,因为Array是固定大小的(即您不能添加或删除元素),因此通常使用诸如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视为抽象类,因此您需要实例化其子类以获得固定大小的数组。