2014-10-03 5 views
0

에서 스택의 인쇄 방법을 만들기 나는 클래스 'AStack'라고 한는 스몰 토크

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

는 그것은 '요소 객체'가

initialize 
super initialize. 
elements := OrderedCollection new 

그것은 멤버 클래스를 밀어 것입니다 유지하는 OrderedCollection 개체 포함 팝업 : 각각

push: anObject 
self elements addFirst: anObject 

pop 
^self elements removeFirst 

timesRepeat를 사용하여 인쇄하는 인쇄 방법을 쓰려고합니다. 스택의 ontents와 동시에 비 웁니다. 'element'(print^self name)에 대해 자식 클래스 print 메소드를 호출하고 '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 말한다 Pharo 내 오류가 위의 코드를 실행하면 : AStack >> 요소합니다.

더 많은 코드가 필요한 경우 언제든지 문의하십시오. #push:self elements를 사용하고 아마 당신이 AStack#elements 방법을 가지고 있지 않는 한

답변

2

는 지금까지 내가 추측 할 수와 같은 오류가 stk push: o1.에서 발생합니다.

스택을 비우는 경우 self size timesRepeat: 대신 [ self notEmpty ] whileTrue: [ … ]이나 [ self isEmpty ] whileFalse: [ … ]과 같은 변형을 사용하지 않는 것이 더 합리적입니다. 코드를 이해하기 쉽게 만듭니다.

우리가 이해 가능성에 대해 이야기로, 일반적으로 사람들이 #print 방법은 모든 인스턴스 변수를 스몰 토크 자신의 모음 :

+0

다음과 같습니다 "인쇄 자체의 크기 timesRepeat : [성적 증명서 쇼 : 자동 팝업 인쇄]" 로 충분? – BDillan

0

를 파괴 할 것이라고 기대하지 않습니다 엄격하게 개인이다. 즉, 접근자를 명시 적으로 정의하지 않는 한 객체는 메시지 '요소'를 이해하지 못합니다. 당신이 접근을 통해 '요소'를 노출하지 않으려는 경우 귀하의 경우에는

, 당신은 또한, 나는 size 어디서나 정의 표시되지 않습니다 elements

으로 self elements의 모든 항목을 대체 할 수 있습니다. 그래서 정의는 같아야합니다 :

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