如何在GNU Smalltalk中对OrderedCollection进行子类化?

如何在GNU Smalltalk中对OrderedCollection进行子类化?,smalltalk,gnu-smalltalk,Smalltalk,Gnu Smalltalk,我正在读一本使用VisualWorks的书,我试图用GNU Smalltalk编写代码。我有这个: OrderedCollection subclass: Stack [ push: anObject [ self addLast: anObject. ] pop [ self isEmpty ifTrue: [^nil] ifFalse: [^self removeLast]. ]

我正在读一本使用VisualWorks的书,我试图用GNU Smalltalk编写代码。我有这个:

OrderedCollection subclass: Stack [
    push: anObject [
         self addLast: anObject.
    ]

    pop [
        self isEmpty
           ifTrue: [^nil]
           ifFalse: [^self removeLast].
    ]
]

| st |
st := Stack new.
st push: 'a'.
Transcript show: st pop.

但它不起作用。有人能解释一下我做错了什么吗?

我假设你得到的是
对象:堆栈错误:不应该在这个类中实现,使用#basicNew代替

如果是这样,那么看起来您需要在子类的主体中添加

见:


这对我来说似乎有点漏洞百出,但我想这就是问题所在。

主要问题是设计问题。在学习smalltalk和面向对象时,如果您默认选择组合而不是继承,您会更高兴。堆栈的接口非常有限

push: anElement
pop
isEmpty
那么,为什么不使用实例变量
stackData

Stack>>initialize
    stackData := OrderedCollection new

OrderedCollection有一个非常宽的接口,通过这种方式可以得到一个只响应非常窄的接口的堆栈。这使得它更容易理解和使用

您的代码没有问题。 是GNU-ST做了很多事情

在其他的小谈话中,这就像一种魅力。 以下是我在Smalltalk/X工作区中输入的内容,它实现了预期的效果(在成绩单上显示“a”):


你能更具体地说明什么不起作用以及具体如何起作用吗?我得到了Object:Stack error:不应该在这个类中实现,而是使用#basicNew。斯图尔特的回答正是我所需要的。在未来,我会尝试更加具体,并添加我收到的消息。就是这样。你能给我解释一下这到底是怎么回事吗?从文件中我不太明白。我们为什么不在通过继承创建的所有类上使用它呢?pragmas是GNU Smalltalk特有的东西,我对它不是很熟悉。但我怀疑这只是一种设计折衷-它将向编译器提供特殊信息,告诉它这是一种特殊类型的类-并且考虑到你很少想将其中一种类型的子类化,这可能被认为是简化实现的合理折衷。我理解你的意思,我也听说过:“总是喜欢构图而不是继承”。这是我的第一个oo语言,随着时间的推移,我想我会提高我的设计技能。但上面的代码片段只是一个简单/虚拟的示例,它从未打算用于实际应用程序中。
OrderedCollection 
    subclass: #MyStack
    instanceVariableNames:''
    classVariableNames:''
    poolDictionaries:''.

MyStack compile:'
    push: anObject
         self addLast: anObject.
'.

MyStack compile:'
    pop
        self isEmpty
           ifTrue: [^nil]
           ifFalse: [^self removeLast].
'.

| st |

st := XStack new.
st push: 'a'.
Transcript show: st pop.