Конструктор не найден - PullRequest
       18

Конструктор не найден

1 голос
/ 03 декабря 2009

Я пытаюсь реализовать новый класс в Squeak, и по какой-то причине, когда я запускаю тест, я получаю сообщение об ошибке MessageNotUnderstood, даже если сообщение определено. Код класса:

Object subclass: #ClassAnalyzer
instanceVariableNames: 'theClasses'
classVariableNames: ''
poolDictionaries: ''
category: 'OOP3'!

!ClassAnalyzer methodsFor: 'initialize-release' stamp: 'NK 11/30/2009 22:50'!
initialize: setOfClasses
theClasses := setOfClasses.! !

!ClassAnalyzer methodsFor: 'initialize-release' stamp: 'NK 11/30/2009 22:49'!
newWith: input
[input isKindOf: Collection]
    ifFalse: [^ClassAnalyzer new: input].
^ClassAnalyzer new: (input asSet).! !

И вот тест, который я провел:

| abcd z |
z:=1class.
abcd:= ClassAnalyzer newWith: z.

Есть идеи, что я делаю не так? Моя текущая теория состоит в том, что, поскольку при вызове конструктора еще нет объекта, поэтому он должен быть немного другим (возможно, в Object или protoObject должна быть предопределенная функция с тем же именем), но если это так, то как бы один определить неопределенный именованный конструктор без изменения объекта?

Ответы [ 2 ]

1 голос
/ 06 декабря 2009

Вы должны определить конструктор на стороне класса. В браузере есть три кнопки [ instance ][ ? ][ class ], нажмите кнопку class, чтобы добавить методы на стороне класса. Не забудьте переключиться обратно на сторону экземпляра после того, как закончите.

0 голосов
/ 08 декабря 2009

Обратите внимание, что ваша строка может содержать ошибку:

 [input isKindOf: Collection]
        ifFalse: [^ClassAnalyzer new: input]

Вместо этого вы, вероятно, захотите вызвать ifFalse для логического значения, поэтому вы использовали неправильные скобки. Вместо этого сделайте:

 (input isKindOf: Collection)
        ifFalse: [^ClassAnalyzer new: input]

Остальное было покрыто Адрианом (newWith: должно быть на стороне класса. На языке Java вы бы назвали его статическим методом).

...