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.

知道我做错了什么吗?我目前的理论是,因为当你调用构造函数时还没有对象,所以它应该有点不同(也许在 Object 或 protoObject 中应该有一个同名的预定义函数),但如果是这样,那么如何在不更改对象的情况下定义一个非标准的命名构造函数?

4

2 回答 2

1

您应该在类端定义构造函数。在浏览器中有三个按钮[ 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]

其余的由 Adrian 覆盖(newWith: 应该在类方面。用 Java 的说法,你可以称它为静态方法)。

于 2009-12-07T23:31:11.853 回答