2013-03-05 54 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