1

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.

私が間違っていることは何か分かりますか?私の現在の理論では、コンストラクターを呼び出すときはまだオブジェクトがないため、少し異なるはずです (オブジェクトまたは protoObject に同じ名前の事前定義された関数があるはずです)。オブジェクトを変更せずに、非標準の名前付きコンストラクターを定義しようとしていますか?

4

2 に答える 2

1

クラス側でコンストラクターを定義する必要があります。ブラウザには 3 つのボタンがあり[ instance ][ ? ][ class ]、ボタンをクリックしclassてクラス側にメソッドを追加します。完了したら、インスタンス側に戻すことを忘れないでください。

于 2009-12-05T21:31:05.513 に答える
0

この行には間違いが含まれている可能性があることに注意してください。

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

代わりに、ブール値でifFalseを呼び出したいと思うので、間違った種類の中括弧を使用しました。代わりに:

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

残りはエイドリアンによってカバーされました(newWith:はクラス側にあるはずです。Javaの用語では、静的メソッドと呼びます)。

于 2009-12-07T23:31:11.853 に答える