我正在尝试在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中应该有一个相同名称的预定义函数),但如果这是交易,那么将如何一个是在不改变Object的情况下定义一个无标准的命名构造函数?
答案 0 :(得分:1)
您应该在类侧定义构造函数。在浏览器中有三个按钮[ instance ][ ? ][ class ]
,单击class
按钮可在类侧添加方法。完成后不要忘记切换回实例端。
答案 1 :(得分:0)
请注意,您的这一行可能包含错误:
[input isKindOf: Collection]
ifFalse: [^ClassAnalyzer new: input]
相反,您可能希望在布尔值上调用ifFalse,因此您使用了错误的大括号。而是做:
(input isKindOf: Collection)
ifFalse: [^ClassAnalyzer new: input]
其余部分由Adrian负责(newWith:应该在课堂上。用Java的说法,你称之为静态方法。)