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"
调用该方法。如何解决?
答案 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