覆盖squeak中的编译方法

时间:2014-12-09 18:22:05

标签: smalltalk squeak

如何覆盖行为方法:

  compile: code notifying: requestor trailer: bytes ifFail: failBlock

在新函数中(覆盖了Behavior的编译)我需要在对象" code"中编译该方法。我是否需要将其声明为类方法?

并且,代码(包含要编译的方法)是String类型吗?

2 个答案:

答案 0 :(得分:3)

令人困惑的是,浏览器没有显示并行的类侧层次结构......

你知道true是一个True类的实例,所以如果你发送一个消息为true,它必须被它的类True或其中一个超类理解。我们可以使用浏览器浏览这组消息:

True browseHierarchy.

如果我们通过重复发送超类消息来查询继承,那么它与层次结构浏览器显示的内容非常匹配,到目前为止一直很好:

True superclass -> Boolean.
Boolean superclass -> Object.
Object superclass -> ProtoObject.
ProtoObject superclass -> nil.

现在如果您向True类发送消息该怎么办?它将被它的类True类(它是一个元类True class class == Metaclass)所理解。

但是,让我们查询元类True class的层次结构:

True class superclass -> Boolean class.
Boolean class superclass -> Object class.
Object class superclass -> ProtoObject class.
ProtoObject class superclass -> Class.
Class superclass -> ClassDescription.
ClassDescription superclass -> Behavior.
Behavior superclass -> Object.
Object superclass -> ProtoObject.
ProtoObject superclass -> nil.
啊啊啊啊!它比浏览器显示的更深......
不出所料,您在此层次结构中找到Class,以满足此要求:

"True is a (kind of) class" (True isKindOf: Class) -> true.

由于True类继承自Behavior,所以True类的所有实例都理解任何Behavior方法(通常,只有一个,True class soleInstance == True)。

所以,回到问题,当你想要将实例端方法添加到true时,你要求它的类编译一个新方法:

True compile: 'asInt ^1'.

现在,true回应此#asInt消息:

(true respondsTo: #asInt) -> true.

然后您可以发送到任何True实例(同样,应该只有一个True initializedInstance == true):

true asInt -> 1.

如果你想在类的一侧安装一个方法,那个类是True响应的,那么你会问到元类,True类或其中一个超类:

Boolean class compile: 'soleInstance ^self initializedInstance'.

现在你可以问:

True soleInstance -> true.

教训是这样的:如果某个工具(如浏览器)只是显示对象的部分视图,响应,继承等等,然后尝试使用其他工具,如:

True class explore.

更重要的一课:你在现场环境中,所以最终使用瑞士刀工具 - 发送消息,如果不理解,有些对象会友好地告诉你;)

既然我已经解决了你的功课问题,这对你来说是一个更难的问题:如果你想拦截在课堂编译的方法的编译,你会在哪里覆盖#compile:...?< / p>

答案 1 :(得分:2)

  1. 如果你想知道你是否应该在课堂上定义它,你为什么不尝试并向我们报告;)这是一个现场,动态系统的魔力 - 它是你的实验! / LI>
  2. 代码是字符串类型 - 通常是ByteString