我正在使用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.
但它不起作用。有人可以解释一下我做错了什么吗?
答案 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.