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

+0

Хм ... Полагаю, так ли это что-то меняет? На самом деле я только начал и скомпилировал его под идеоном до сих пор. – Fuv

ответ

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

3

Насколько я понимаю, вы определили новое как метод экземпляра, а не класс.

Когда вы вызываете Node new, сообщение отправляется объекту класса Node и создает экземпляр, который вы назначаете переменной object. Затем, когда вы посылаете new к этой переменной, приемник является экземпляром Node и имеет СВОЙ определенный new

Вот пример того, как добавить метод к классу в GNU Smalltalk http://www.gnu.org/software/smalltalk/manual/html_node/Defining-methods.html

+0

Да, я тоже нашел это, но задаюсь вопросом, как это исправить. – Fuv

+0

@Fuv Какой маленький штрих вы используете? Может быть, вы должны определить метод как 'class >> new [...' – Uko

+0

Я проверил и это GNU Smalltalk gst 3.1 О вашем предложении я получаю: 'prog.st:5: класс ключа не найден' – Fuv

Смежные вопросы