类的三大特性 你不可不知

技术与开发

学习内容:面向对象  学习进度:第九课  上手难度:★★★  考试类型:二级Delphi

考生在理解了类的定义之后,接下来还应该了解类的核心特性,类的核心特性包括类的封装性、继承性、多态性,考生需要了解这三个特性的基本含义,重点要理解类成员的访问权限。

类的特性1:封装性

什么是类的封装?

类的封装就是把数据和代码组合在同一个结构中,将类的数据封闭在对象的内部。外部程序只有使用正确的方法才能访问要读写的数据。封装意味着数据和代码同时出现在同一结构中,如果需要,只有使用正确的方法才能对数据进行操作。

深入理解类成员的访问权限

在Object Pascal中定义了5种用于控制访问类中数据的保留字,分别是private、 protected、public、published和automated,通过这些保留字可以控制对类中成员的访问权限。考生需要深入理解private、 protected、public三种保留字的用法。

private:具有private属性的成员称为私有成员,不能被类所在单元以外的程序访问。一个私有的属性不可以在其他模块中读写,一个私有方法也不可以在其他模块中被调用。但是如果在同一个单元文件中定义了两个类,那么在一个类的成员中就可以对另一个类中的私有变量进行访问,或者调用另一个类中的私有方法。

protected:具有protected属性的成员称为保护成员,可以被该类的所有派生类访问,并且成为派生类的私有成员。

public:具有public属性的成员称为公有成员,可以被该类以外的类访问。

小知识:在保留字中申明的成员的访问权限不同。当类中的成员只能被该类访问,不允许被该类所在单元以外的程序访问时我们可以把成员(无论数据成员或是成员函数)在类的private中申明;当类中的成员需要被该类及其派生类访问时,我们可以把成员在类的protected中申明;当类中的成员需要被任何类访问时,我们可以把成员在类的public中申明,但是需要注意的是如果两个类不在同一个单元文件中,需要在uses语句中被访问的类所在的单元名称后使用。

类的特性2:继承性

什么是类的继承性?

类的继承性是子类自动共享父类之间数据和方法的机制,它由类的派生功能体现。在既有类的基础上构造新的类,即新类从一个或多个已有的类中继承数据和方法,同时增加或重新定义数据和方法,由此构造出一个新的类型,称为子类,那些已有的类则称为父类。父类是创建子类的基石,它能使子类利用父类的属性,继承父类的字段、属性、方法和事件。子类除了具备父类的属性外还可以给继承来的属性添加新的成员。继承的主要目的是实现代码的重用。

重点掌握类如何进行继承

定义子类时使用关键字class来指定一个父类,这样新定义的类就继承了父类的字段、属性、方法和事件。子类的定义格式为:

type

派生类 = class(基类)

{ 派生类新增或改写部分 }

end;

在类的继承中存在一个问题,比如某些从父类继承来的属性和方法在本类中用不上或者有些方法可能不符合子类的要求,这就需要用到重载。重载是指将父类中不适用的方法在子类中重新定义一遍,即重载原来的方法,使原方法的定义无效,以满足子类的要求。

类的特性3:多态性

什么是类的多态性?

在面向对象程序设计中,多态性是指相同的操作,在不同类的对象中具体的实现过程不同。Object Pascal支持两种多态性:编译时的多态性和运行时的多态性。编译时的多态性通过重载实现,运行时的多态性通过虚拟方法或动态方法来实现。

了解运行时的多态性实现方法

在Object Pascal语言中,运行时的多态性是通过虚拟方法或动态方法实现的。虚拟方法的地址不是在编译时确定的,是在程序运行期间根据调用这个虚拟方法的对象实例来决定的,这种方法又叫滞后联编(动态联编)。虚拟方法可以在派生类中重新被定义,但祖先类中仍然可以被调用。

动态方法是编译器为每一个动态方法指定一个独一无二的数字,用这个数字和动态方法的地址构造一个动态方法表(DMT)。

小知识:虚拟方法比动态方法用的内存要多,但它执行得比动态方法快,但类型对象占用空间大;而动态方法的代码数量比较少。

读者反馈

读者 赵思思:在声明类的三类成员(字段、属性、方法)时,有先后顺序之分吗?

小新解答:有先后顺序。在类中,字段的声明必须放在属性和方法的声明之前。比如Procedure Move; Age:integer; name:string;如果按这种顺序先声明方法再声明字段,编译器将报错,正确的是Age:integer; name:string; Procedure Move。