面向对象编程中的继承与组合
一、继承相关知识
- 编译器的“基址加偏移”机制及问题
- 编译器通过“基址加偏移”机制来定位对象的实例变量。给定对象的基地址(即第一个实例变量的第一个字节的内存位置),编译器通过在该地址上加上偏移量来找到其他实例变量。
- 例如,若圆角矩形对象的基地址为 0x1000,isa 实例变量位于 0x1000 + 0 即 0x1000。isa 是一个 4 字节的值,那么下一个实例变量 fillColor 从偏移量为 4 的位置开始,即 0x1000 + 4 也就是 0x1004。
- 这种机制存在问题,偏移量被硬编码到编译器生成的程序中。如果苹果工程师想给 NSObject 添加新的实例变量,会改变所有实例变量的偏移量,这就是脆弱基类问题。不过,Leopard 引入的新 64 位 Objective - C 运行时通过间接方式确定实例变量位置,解决了这个问题。
- 方法重写
- 当创建新的子类时,通常会添加自己的方法。有时会添加引入独特功能的新方法,有时会替换或增强超类定义的现有方法。
- 例如,对于 Cocoa 的 NSTableView 类,可以添加一个新方法 speakRows,用语音合成器播报列表内容。
- 也可以创建一个子类来调整从超类继承的现有行为。在 Shapes - Inheritance 中,Shape 类设置了形状的填充颜色和边界,但不知道如何绘制。因为 Shape 是通用的抽象类,每个形状的绘
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



