我的文章-《剖析Delphi中的多态》

2008-04-09 04:23:17来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

剖析Delphi中的多态

1什么是多态? 2
1.1概念 2
1.2多态的意义 2
1.3多态在delphi中如何实现的? 2
1.3.1 继承(Inheritance) 2
1.3.2 虚方法、动态方法与抽象方法,VMT/DMT,静态绑定与动态绑定 2
1.3.3 重载(Overload)与多态 2
1.4多态种类的探讨 2
1.4.1 两级多态 2
1.4.2 不安全的多态 2
2 VCL中多态的应用 2
2.1构造与析构方法 2
2.2 Tstrings 2
2.3其他(请soul来补充) 2

摘 要 多态是面向对象的灵魂所在,理解多态是掌握面向对象技术的关键之一,本文着重分析多态的基本原理、多态的实质以及在VCL中的应用。
关键字 多态、继承、面向对象、VCL、虚函数(virtual Method)、覆载(override)


问题
多态是面向对象的灵魂所在,理解多态是掌握面向对象技术的关键之一。但是到底什么是多态?多态有何意义?怎么实现多态?多态的概念我能懂,但不知道如何使用以及什么时候该使用呢?请看本文细细道来。
专家分析
天地生物(物,即对象),千变万化;而在计算机世界里,只有一行行机器指令,两者似乎毫不相干,过去要用计算机语言来很好地描述现实世界是一件很困难的事情,虽然有人用C语言写出面向对象的程序来,但我敢断定其写法是极其烦琐的,直到面向对象(Oriented-Object 简称OO)的出现,一切都随之改观,整个软件业发生了翻天覆地的变化,从编程语言的变化开始,出现了一系列面向对象编程语言(OOP)如SmallTalk、C 、Java、Object Pascal、C#等;随之各种面向对象开发工具也出现了如VC、Delphi、BCB、JBuilder等,并出现了许多优秀的类库如VCL、.net Framework和一些商业类库等;再发展到了面向对象的设计(OOD),面向对象的分析(OOA)以及面向对象的数据库(OODB),面向对象技术几乎贯穿了整个软件领域,程序员的思考方式也发生了根本性的变化!在一些OO纯化论者眼中,一切皆是对象!虽然我不完全同意这种看法。但我认为这种方式最符合人们的思维习惯,它使程序员能集中精力考虑业务逻辑,由计算机来完成面向对象到机器指令的转换(由面向对象的编译器来完成),程序员的大脑从此解放出来了!这是一场革命!
面向对象的核心内容是对象,封装,继承,多态和消息机制,其中多态就是为了描述现实世界的多样性的,也是面向对象中最为重要的特性,可以这么说,不掌握多态,就没有真正地掌握面向对象技术。
1什么是多态?
1.1概念
多态的概念众说纷纭,下面是几种代表性的说法:
“This ability to manipulate more than one type with a pointer or a reference to a base classis spoken of as polymorphism” (《C Primer》第838页)。即用基类的指针/引用来操作多种类(基类和其派生类)的对象的能力称之为多态。它是从语言实现的角度来考虑的。
“polymorphism provides another dimension of separation of interface from implementation, to decouple what from how”(《Think in Java》3rd edtion),即多态提供了另外一种分离接口和实现(即把“做什么”与“怎么做”分开)的一种尺度。它是从设计的角度考虑的。
“The ability to use the same expression to denote different operations is refered to as Polymorphism”,(《Object-Oriented Methods Principles & Practice》3rd Edition,第16页)。简单的说,多态就是“相同的表达式,不同的操作”,也可以说成“相同的命令,不同的操作”。这是从面向对象的语义的角度来看的。
三种说法分别从不同的角度来阐述了多态的实质。其中第三种说法尤为确切,下面着重分析第三种说法。
先解释这句话的含义:
相同的表达式—函数调用
不同的操作 —根据不同的对象就有不同的操作。
举个例子来说明,比如在公司中有各种职责不同的员工(程序员,业务员,文管等),他们“上班”时,做不同的事情(也可以看作是一种业务逻辑),我们把他们各自的工作都抽象为"上班",关系如下:
员工
/ | \ ——继承关系
程序员 业务员 文管

每天上班时间一到,相当于发了一条这样的命令:
“员工们.开始上班”(同一条表达式)
每个员工接到这条命令(同样的命令)后,就“开始上班”,但是他们做的是各自的工作,程序员就开始“Coding”,业务员就开始“联系业务”,文管员就开始“整理文档”。即“相同的表达式(函数调用),(在运行期根据不同的对象来执行)不同的操作”。
从语言实现多态的角度来说,多态是通过基类指针或引用指向派生类的对象,调用其虚方法实现的。下面是Object Pascal语言的实现
TEmployee=class //把员工抽象为一个抽象类
public
procedure startWorking;virtual;abstract;
{抽象函数(即C 中纯虚函数),什么也不做,实际的意义是,先预留一个接口。在其派生类中覆载实现它。}
end;

TProgramer=class(TEmployee) //程序员
public
procedure startWorking;override;
end;

TBusinessMan=class(TEmployee) //业务员
public
procedure startWorking;override;
end;

TDocManager=class(TEmployee) //文管
public
procedure startWorking;override;
end;
procedure TProgramer.startWorking;
begin
showmessage(''''coding'''');
end;

{ TbusinessMan }

procedure TbusinessMan.startWorking;
begin
showmessage(''''Linking Business'''');
end;

{ TDocManager }

procedure TDocManager.startWorking;
begin
showmessage(''''Managing Document'''');
end;

procedure TForm1.Button1Click(Sender: TObject);
const
eNum=3;
var
Employee:array of TEmployee;

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:多层数据库开发十二:使用数据控件

下一篇:我的文章-《剖析Delphi中的构造和析构》