2009-12-03 3 views
1

J'essaie d'implémenter une nouvelle classe dans Squeak, et pour une raison quelconque, lorsque je lance un test, j'obtiens une erreur MessageNotUnderstood, même si le message est défini. Code de classe:Constructeur introuvable

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).! ! 

Et voici le test j'ai couru:

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

Toute idée de ce que je fais mal? Ma théorie actuelle est que lorsque vous invoquez un constructeur, il n'y a pas encore d'objet, donc ça devrait être un peu différent (peut-être qu'il devrait y avoir une fonction prédéfinie du même nom dans Object ou protoObject) irions-nous sur la définition d'un constructeur nommé none standard sans changer Object?

Répondre

1

Vous devez définir le constructeur du côté de la classe. Dans le navigateur, il y a trois boutons [ instance ][ ? ][ class ], cliquez sur le bouton class pour ajouter des méthodes du côté de la classe. N'oubliez pas de revenir au côté de l'instance une fois que vous avez terminé.

0

Notez que cette ligne de la vôtre est susceptible de contenir une erreur:

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

Au lieu de cela, vous voulez probablement appeler ifFalse sur un booléen, si vous avez utilisé le mauvais genre d'accolades. Au lieu de cela faire:

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

Le reste a été couvert par Adrian (newWith: devrait être du côté de la classe Dans le langage Java, vous appelez une méthode statique.).