如何在GNU Smalltalk中继承OrderedCollection?

时间:2014-01-29 20:45:50

标签: smalltalk gnu-smalltalk

我正在使用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.

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

3 个答案:

答案 0 :(得分:3)

我假设你得到Object: Stack error: should not be implemented in this class, use #basicNew instead

如果是这样,那么您需要在子类的主体中添加<shape: inherit>

见:

这对我来说似乎有点漏洞 - 但我猜它就是这样。

答案 1 :(得分:0)

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

push: anElement
pop
isEmpty

那么为什么不使用实例变量Stack

创建一个类stackData
Stack>>initialize
    stackData := OrderedCollection new

OrderedCollection具有非常宽的接口,这样您就可以获得仅响应非常窄的接口的Stack。这使得理解和使用变得更加容易。

答案 2 :(得分:0)

您的代码没有任何问题。 它是GNU-ST,可以做出奇怪的事情。

在其他Smalltalks中,这就像一个魅力。 这是我输入Smalltalk / X工作区的内容,它完成了预期的操作(在Transcript上显示'a'):

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.