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,因此必须调用 setter

于 2013-03-05T17:19:11.437 回答
3

据我了解,您将 new 定义为实例的方法而不是类。

当您调用 时Node new,会向类对象发送一条消息Node,它会创建一个您自己分配给object变量的实例。然后,当您发送new到该变量时,接收器是Node您定义的实例new

这是一个关于如何在 GNU Smalltalk http://www.gnu.org/software/smalltalk/manual/html_node/Defining-methods.html中向类添加方法的示例

于 2013-03-05T17:06:04.000 回答