2

我想用一个类创建一个 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

我怎么解决这个问题?

4

1 回答 1

6

你可能真的不想这样做。我通常使用 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 视为抽象类,因此您需要实例化它的子类以获得固定大小的数组。

于 2018-09-22T15:28:52.633 回答