2014-10-03 30 views
0

創建打印方法堆棧我有一類稱爲「AStack」在Smalltalk

Object subclass: #AStack 
    instanceVariableNames: 'elements' 
... 

它包含了擁有它的「元素對象」

initialize 
super initialize. 
elements := OrderedCollection new 

它的成員類推送OrderedCollection對象和流行,分別爲:

push: anObject 
self elements addFirst: anObject 

pop 
^self elements removeFirst 

我想寫一個打印方法,使用timesRepeat打印c堆棧的內容以及同時清空。它調用每個'元素'的子類打印方法(print^self name)並使用'Transcript'在屏幕上輸出它。

print 
self size timesRepeat: [ Transcript show: elements print. self pop ] 

工作區碼:

| o1 o2 stk | 

o1 := Object new. 
o1 name: 'object1'. 

o2 := Object new. 
o2 name: 'object2'. 

stk := AStack new. 
stk push: o1. 
stk push: o2. 

stk print. 

在運行上面的代碼,我得到內菲羅,說MessageNotUnderstood錯誤:AStack >>元素

如果您需要更多代碼,請不要猶豫。

回答

2

據我可以猜測,在stk push: o1.出現誤差#push:使用self elements,可能你沒有在AStack#elements方法。

同樣爲了清空你的堆棧,更合乎邏輯的是不使用self size timesRepeat:而是[ self notEmpty ] whileTrue: [ … ]或其他變化如[ self isEmpty ] whileFalse: [ … ]。它使代碼更易於理解。

當我們談論可理解性,通常人們不要指望#print方法會破壞他們的收藏:)

+0

請問: 「打印 自我大小timesRepeat:成績單顯示:自彈出打印]」 就夠了? – BDillan 2014-10-04 17:05:17

0

在Smalltalk中所有的實例變量是嚴格保密。它的意思是:除非明確定義訪問器,否則對象不會理解消息的「元素」。

在你的情況,如果你不想通過存取暴露「元素」,你可以通過elements

替換self elements所有出現的還有,我沒有看到任何地方size定義。因此,定義應該是這樣的:

AStack>>size 
    ^elements size 
0
OrderedCollection subclass: Stack [ 
    <shape: #inherit> 
    pop [ 
     |lastElement| 
     lastElement := self last. 
     self removeLast. 
     ^lastElement 
    ] 

    push: value[ 
     self addLast: value. 
    ] 

] 
+1

你救了我,等了3年。所有的痛苦終於結束了 – BDillan 2018-02-28 19:58:38