2014-01-29 4 views
1

VisualWorks를 사용하여 책을 읽었으며 GNU 스몰 토크에서 코드를 작성하려고합니다. 나는 이것을 가지고있다 :GNU 스몰 토크에서 OrderedCollection을 서브 클래스 화하는 방법은 무엇입니까?

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

당신이 일하는 방법을 정확하게되지 않은 사항에 대한 자세한 특정 될 수 있을까? – Uko

+0

Object : Stack error :이 클래스에 구현해서는 안되며 #basicNew를 대신 사용하십시오. 스튜어트의 반응은 내가 필요한 것이었다. 앞으로 좀 더 구체적이고 또한 내가받는 메시지를 추가하려고 노력할 것입니다. – caisah

답변

3

나는 Object: Stack error: should not be implemented in this class, use #basicNew instead을 얻고 있다고 가정하고 있습니까?

그렇다면 하위 클래스 본문에 <shape: inherit>을 추가해야합니다.

참조 :

- 그러나 나는 그것이 무엇인지 추측한다.

+0

그것이 였습니다. 이 정확히 무엇을하고 있는지 설명해 주시겠습니까? 나는 그 문서를 이해하지 못한다. 상속을 통해 만드는 모든 클래스에서 사용하지 않는 이유는 무엇입니까? – caisah

+1

pragma는 GNU 스몰 토크 고유의 것으로, 그다지 익숙하지 않습니다. 하지만 그것은 단지 설계상의 단점이라고 생각합니다. 컴파일러에 특별한 정보를 제공하여 클래스의 특별한 유형이라고 알려줍니다. 그리고이 유형 중 하나를 서브 클래 싱하려는 경우는 매우 드물기 때문에 아마 합리적인 것으로 간주됩니다 구현을 간소화하기위한 절충. –

0

주요 문제는 디자인 문제입니다. 작은 토크와 객체 지향을 배울 때 기본적으로 상속이 아니라 구성을 선택하면 더 행복해집니다. 스택은 왜 변수 인스턴스와 클래스 Stack을하지

push: anElement 
pop 
isEmpty 

때문에 매우 제한된 인터페이스를 가지고 stackData

Stack>>initialize 
    stackData := OrderedCollection new 

OrderedCollection은 매우 넓은 인터페이스를 가지고 있으며,이 방법 당신은 스택을받을 만 매우 좁은 인터페이스에 응답합니다. 따라서 이해하고 사용하는 것이 훨씬 쉬워집니다.

+0

나는 당신이 의미하는 것을 이해하고, 나는 "상속에 대한 구성을 항상 좋아합니다"라고 들었습니다. 이것은 나의 첫번째 oo 언어이고 시간과 더불어, 나는 나의 디자인 기술을 날카롭게 할 것이라고 생각한다. 그러나 위의 스 니펫은 단순한/더미 예제이며 실제 응용 프로그램에서는 사용하지 않았습니다. – caisah

0

코드에 아무런 문제가 없습니다. 그것은 이상한 일을하는 GNU-ST입니다.

다른 스몰 토크에서 이것은 매력처럼 작동합니다. 여기 내가 스몰 토크/X 작업 영역에 입력 한 내용이며, 않습니다 예상 (쇼 '는'성적 증명서에) :

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.