2.4 KiB
2.4 KiB
类的架构与反射:系统怎样描述自己
原书依据:第 8 章,印刷页 40–52,PDF 页 51–63;结合第 3 章元类介绍。
类既组织实例行为,又作为对象接受消息。把“谁是谁的实例”与“谁继承谁”分成两条关系,才能读懂元类。
三个层次的责任
| 类 | 原书讨论的主要责任 |
|---|---|
Behavior |
方法字典、实例创建和类层级操作 |
ClassDescription |
变量名、分类、源码组织与编译相关描述 |
Class |
表示通常使用的类对象 |
Metaclass |
表示类对象所对应的元类 |
Class 和 Metaclass 都属于 ClassDescription 的子类体系。对于具体类对象,可以用 class 访问其元类;实例侧与类侧的方法分别组织在相应行为对象中。
原书元类部分文字较简略。不能据此把所有具体元类都画成直接继承 Class 的平面结构;具体元类的父类关系应在目标镜像中检查。
研究一次消息查找
Integer superclass
Number subclasses
Number allSubclasses
这是向类对象发消息,查询系统结构。阅读结果时区分“直接子类”和“全部后代”;枚举顺序不应成为应用逻辑依赖。
方法字典把选择子映射到方法。查找协议从当前类的字典开始,再沿 superclass 关系继续。Browser 的实现者查询、类层级浏览和方法安装,都建立在这类可访问的描述结构上。
编译是系统服务
原书把方法编译、分类管理、变量名访问和类的文件导出放进类描述协议。由此可以理解:Browser 中接受一段方法文本,是向运行中的系统安装行为。
应分别记录:源文本、编译后方法、当前类结构,以及镜像中的对象状态。只导出源文本,并不一定包含恢复某个实验状态所需的全部数据。
多重继承的边界
第 8 章最后讨论多重继承。阅读时将“讨论的组织方案”与前面实际使用的单一父类查找链分开,不能因为书中出现这一节就宣称标准 Smalltalk-80 类定义普遍支持多重继承。
可复现的探索记录
在镜像中选择一个类,记录其父类、实例变量、实例侧选择子与类侧选择子;再选择一个继承而来的方法,注明实际定义类。这个小表可以验证你是否把类对象、实例和元类混在了一起。本文只给出检查路线,尚未在镜像执行。