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メソッドが呼び出されないため、値を設定したり、初期化関数を呼び出したりできないことです。さらにそのようなものの後:

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

メソッドが呼び出されます。それを修正する方法は?

4

2 に答える 2

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ため、セッターを呼び出す必要があります。

于 2013-03-05T17:19:11.437 に答える
3

私が理解している限り、あなたはクラスではなくインスタンスのメソッドとしてnewを定義しました。

を呼び出すNode newと、メッセージがクラスオブジェクトに送信され、変数Nodeに割り当てるそれ自体のインスタンスが作成されます。object次に、newその変数に送信すると、レシーバーはのインスタンスでNodeあり、new

これは、GNUSmalltalkhttp : //www.gnu.org/software/smalltalk/manual/html_node/Defining-methods.htmlのクラスにメソッドを追加する方法の例です。

于 2013-03-05T17:06:04.000 に答える