本章重点摘要:
- 对象模型机制
- 动态绑定机制
- 类型转换机制
- 接口抽象机制
一、对象模型机制
对象本质:
- 相关代码和数据的组合,是包含相互之间有联系的过程集和数据的软件包
- 可以视为变量,其类型为“类”
- 类是对象的模板或模型,对象是类的实例
- 对象是服务提供者
对象模型的一些概念:
- 对象 问题域中有明确意义的事物
- 类 描述了有共同属性、行为、特征的对象
- 属性 数据值
- 行为 功能
- 联系 对象间的物理或概念上的联系
- 关联 类之间的联系
- 聚合 A "has a" B
- 继承 A "is a" B
对象模型图:
对象之间的关系:
- 继承关系--保持对象之间的差异性的同时共享对象的相似性。继承关系分两种:类对对象接口的实现,即接口继承;类对类的继承,即实现继承。
- 合成关系--新的对象由已有的对象组合而成,即单纯复用既有的功能,而非重复运用其形式。合成关系分两种:聚合关系,即部分和整体(has-a),并可传递;组合关系,即包含关系。
如何用继承?
- 派生类是基类的一个特殊种类
- 不要出想需要将派生类换成另一个类的派生类的情况
- 派生类具有扩展基类的责任,不要覆盖掉或注销掉基类的责任
- 最好不要从工具类继承。
继承和合成的比较:
|
优点 | 缺点 |
继承 | 新的实现比较容易;修改或扩展继承而来的实现比较容易 | 破环封装,基类的实现细节暴露给派生类;基类改变影响所有派生类;从基类继承而来实现时静态的,无法运行期间改变,不够灵活 |
合成 | 新对象存取组成对象的唯一方法是通过组成接口;组成对象的内部细节不为新对象所见;支持包装;依赖较少;运行期进行,新对象可动态引用与组成对象类型相同的对象。 | 要管理较多的对象; |
二、动态绑定机制
方法绑定:建立方法调用和方法本体之间关联,分为早绑定,即程序执行前绑定;晚绑定,即执行时根据对象类型进行绑定。
如何动态绑定的途径:
- 虚方法(virtual),允许对不同类中的同名方法有不同的实现,并在运行期进行绑定。使用规则:1)用关键字virtual声明;2)使用覆盖(override)替换或扩展虚方法;3)被覆盖的虚方法参数列表不能更改。
- 动态方法(dymatic),和虚方法基本一致。
多态需要具备的条件:
- 基类定义了一个或多个虚方法
- 一个或多个派生类覆盖那些虚方法
- 一个实例变量(或参数),其类型是基类,但实际上它引用的是某个派生类的一个实例。
三、类型转换机制
类型:分为值类型,是一些简单的数据类型,如Char;引用类型,是一些复杂的类型,如类,对象接口。
向上转型:
- 向上转型是安全的,因为任何派生类都继承自基类,拥有基类的接口(方法)。
- 能够面向接口编程。
向下转型:
- 是一种强制转换,须指明确切类型。
- 在对象参数传递中,通过向上转型传递一个派生类对象参数,在得到该对象后,往往需要向下转型,恢复原来的面貌
- 在对象容器(TObjectList)中取出一个对象时,需要向下转型,否则得到TObject类型。
四、抽象接口机制
接口:规定”做什么“而不管”怎么做“,即它关心的是方法定义的参数,而不是具体实现。它分为宽接口,即delphi的类(通常是抽象类)和对象接口所声明的方法;窄接口,即对象接口,依附于类,但是不能直接实例化,也不能自己实现方法。
抽象类:为派生类定义公共接口,把方法的实现延迟到派生类中。不能实例化,用abstract 限定virtual,dynamic,或override。
抽象类的使用原则:
- 拥有尽可能多的公共代码。
- 拥有尽可能少的数据,以区别具体类。
接口对象的使用;
- 通常继承一个已有的接口来声明一个新接口。
- 接口继承自IInterface接口
|
相同点 | 不同点 |
抽象类 | 不能实例化;提供抽象方法 | 一个类只能继承一个抽象类;派生类可以部分实现; |
对象接口 | 不能实例化;提供抽象方法 | 一个类可以继承多个接口;所有方法都是public;实现接口的类需要实现接口所有的方法; |
对接口而不是对实现编程:根据抽象类或对象接口中定义的接口来操纵对象。对象的类(class)定义了对象是怎样实现的,同时也定义了对象的内部状态和操作实现,而对象的类型只与它的接口相关。在delhi中,类既指对象的类型又制定了对象的实现,但对象接口仅指定对象的类型未指定对象的实现。
请发表评论