2013-03-05 51 views
1
Object subclass: Node [  

    |value| 

    new [ 
     Transcript show: 'Test'. 
      value := 6. 
    ] 

    getValue [ 
     ^value. 
    ] 

    set:sth [ 
     value := sth. 
    ] 

] 

|data| 
data := Node new. 
Transcript show: (data getValue) printString ; cr. "nil" 
data set:5. 
Transcript show: (data getValue) printString. "5" 

問題是一個new方法永遠不會被調用,所以我不能設置值或調用初始化函數。此外在類似之後:Smalltalk自己的新方法

object := Node new. "Not called" 
object new. "Here is called" 

該方法被調用。如何解決這個問題?

+0

那是GNU Smalltalk嗎? – Cubic 2013-03-05 16:35:16

+0

嗯...我想是的,它會改變什麼嗎?實際上,我剛剛開始編譯它在ideone之下。 – Fuv 2013-03-05 16:46:13

回答

5

#new必須在Node class定義的工作:

Object subclass: Node [  

    |value| 

    getValue [ 
     ^value. 
    ] 

    set: sth [ 
     value := sth. 
    ] 

] 

Node class extend: [ 
    new [ | node | 
     Transcript show: 'Test'. 
     node := (super new). 
     node set: 6. 
     ^node 
    ] 
] 

注意value不能從#new在這種情況下訪問,所以二傳手必須調用

+0

非常感謝。你們倆。 – Fuv 2013-03-05 17:30:08

3

據我所知,您將new定義爲實例的方法而不是類。

當您撥打Node new時,會向類對象Node發送一條消息,並創建一個您自己分配給object變量的實例。然後,當你發送new該變量,一個接收器的Node一個實例,並且有您的自定義new

這裏是如何在GNU Smalltalk中的方法添加到類爲例http://www.gnu.org/software/smalltalk/manual/html_node/Defining-methods.html

+0

是的,我也發現,但想知道如何解決它。 – Fuv 2013-03-05 17:09:04

+0

@Fuv你使用的是什麼?也許你應該定義一個方法爲'class >> new [...' – Uko 2013-03-05 17:14:13

+0

我已經檢查過它是GNU Smalltalk gst 3.1 關於你的建議我得到:'prog.st:5:key class not found' – Fuv 2013-03-05 17:17:17