Files
endorphin-tabularium-docs/content/docs/smalltalk/05-reflection.md
T

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 类定义普遍支持多重继承。

可复现的探索记录

在镜像中选择一个类,记录其父类、实例变量、实例侧选择子与类侧选择子;再选择一个继承而来的方法,注明实际定义类。这个小表可以验证你是否把类对象、实例和元类混在了一起。本文只给出检查路线,尚未在镜像执行。