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