Smalltalk拥有自己的新方法

时间:2013-03-05 16:33:54

标签: smalltalk gnu-smalltalk

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方法,因此我无法设置值或调用initialize函数。此外之后:

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

调用该方法。如何解决?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

据我所知,你将new定义为实例的方法,而不是类。

当您致电Node new时,会向类对象Node发送一条消息,并创建一个您自己分配给object变量的实例。然后,当您向该变量发送new时,接收方是Node的实例,并且具有您定义的new

以下是如何在GNU Smalltalk中为类添加方法的示例http://www.gnu.org/software/smalltalk/manual/html_node/Defining-methods.html