1

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

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

4

3 回答 3

3

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

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

看:

对我来说,这似乎有点抽象——但我想它就是这样。

于 2014-01-30T02:44:18.500 回答
0

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

push: anElement
pop
isEmpty

那么为什么不Stack使用实例变量创建一个类stackData

Stack>>initialize
    stackData := OrderedCollection new

OrderedCollection 有一个非常宽的接口,这样你得到一个 Stack 只响应一个非常窄的接口。这使得它更容易理解和使用。

于 2014-01-30T17:07:41.700 回答
0

您的代码没有任何问题。GNU-ST 做了一些奇怪的事情。

在其他 Smalltalks 中,这就像一个魅力。这是我在 Smalltalk/X 工作区中输入的内容,它符合预期(在成绩单上显示“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.
于 2016-10-13T23:16:29.610 回答