类似private,但可以被该类的所有派生类访问
? public
– 可以被外界的所有客户代码直接访问
? published
– 类似public,但可以被Delphi开发环境的Object Inspector所显示
单元级别的封装
? 一个Unit中声明的多个类,互为友元类。 ? 一个Unit的interface部分声明的变量为全局 变量,其他Unit可见。 ? 一个Unit的implementation部分声明的变量 为该unit的局部变量,只在该Unit可见。
封装
? 封装的目的:简化用户接口,隐藏实现细 节。 ? 设计接口:
– 必须保证接口是功能的全集 – 尽量让接口是最小冗余的 – 要保证接口是稳定的
继承的本质
? 继承是为了表现类和类之间的“是一种” 关系 ? 继承是实现多态存在的基础 ? Object Pascal只支持单继承
– 每个派生类只能有一个基类
继承的本质
? Object Pascal只支持公有继承。
– 派生类中基类的public成员在其中仍然是public 的,基类的protected成员在派生类中仍然是 protected的,派生类无法访问基类的private成 员
派生类的大小
? 每个派生类的对象实例所占内存空间的大 小,不但取决于自身的数据成员,还要加 上其基类的数据成员。
– 每一个类的实例对象所占的内存空间,是其自 身的数据成员与其所有基类的数据成员所占内 存空间的总和。 – 每一个派生类的实例对象,内部都包含了一个 完整的基类实例
对象,这个完整的基类实例对 象,就称为“基类子对象”
“是一种”
? 当A是一种B时,那么A的容器(绝对)不是 一种B的容器! ? 圆与椭圆的关系
– 数学上:圆是一种椭圆 – OOP上:圆不是一种椭圆 弱化你的基类,强化你的派生类
普遍 特殊
继承
? 继承的目的:扩展已存在的代码模块,实 现代码复用
? 任何情况下派生类事物都能无条件的取代 基类事物 ? 最佳设计未必最佳
– 具体情况具体分析
多态含义
? 多态性含义: 指不同对象收到相同的消息时,产生不 同的动作。 ? 体现在程序中为: 多态性是指用一个名字定义不同的函 数,这些函数执行不同但又类似的操作, 从而可以使用相同的调用方式来调用这些 具有不同功能的同名函数。
多态的本质
? 多态性允许用户将派生类类型的指针赋值 给基类类型的指针。 ? 多态性在Object Pascal中是通过虚方法 (Virtual Method)实现的
虚方法
? 虚方法就是允许被其派生类重新定义的方 法。(virtual)
? 派生类重新定义基类虚方法的做法,称为 “覆盖”(override)。
覆盖和重载
? 覆盖(override)是指派生类重新定义基类 的虚方法的方法。而重载(overload),是 指允许存在多个同名函数,这些函数的参 数表不同
? 重载的调用入口地址在编译期间就已经静 态确定的(早绑定) ? 覆盖的在运行期动态调用的,调用地址在 运行期才知道(晚绑定)
抽象类
? 凡是含有abstract方法的类被称为“抽象 类”,永远无法创建抽象类的实例对象。 抽象类是被用来作为接口的。 ? 声明为abstract的方法为“抽象方法”(纯 虚)。
? 声明为抽象方法后,基类中不提供这些方 法的实现,而派生类则必须实现它。
多态
? 当调用基类的虚方法时,实际上是调用派 生类中对基类虚方法的实现,这样就实现 多态 ? 实质:父对象就根据当前赋值给它的子对 象的特性以不同的方式运作
应用例子
? 虚方法:Destroy析构函数 ? 非虚方法:Free方法 ? 在定义自己的类时,如果有析构函数存在, 就必须在它的声明之后加上override?
应用例子
? Free方法中首先判断对象本身是否为nil,保 证不为nil时便调用Destroy。 ? 对任何对象执行的都是TObject.Free(),然后 由它调用被每个类重定义了的析构函数 Destroy(),这就保证了任何类型的对象都可 以正确、安全地被析构。
应用例子
? 在定义自己的类时,如果有析构函数存在, 就必须在它的声明之后加上override。 ? 不加override呢? ? 调用Destroy时直接调用基类的Destroy