如何覆盖行为方法:
compile: code notifying: requestor trailer: bytes ifFail: failBlock
在新函数中(覆盖了Behavior的编译)我需要在对象" code"中编译该方法。我是否需要将其声明为类方法?
并且,代码(包含要编译的方法)是String类型吗?
答案 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.
啊啊啊啊!它比浏览器显示的更深...... "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)