end; / m% z3 t' H$ ]. Z. ^6 U8 Y! @
然后,我们从plane派生出两个子类,直升机(copter)和喷气式飞机(jet): ; i: m* \4 @8 y( j
copter = class(plane) $ T1 P2 u' o8 T: D# v( N" _
private
7 v" A' o; C$ c fModal : String; 7 H# i. l& T: l5 B$ s6 H
public 3 l9 m2 R+ u. y* [
constructor Create();
) e& f% K5 Y1 c" J6 Y% p# \5 ? destructor Destroy(); override; 0 j1 q& }6 s: M# \7 m3 `3 F! G6 m: A
procedure fly(); override; , q8 O3 q0 o9 |# t! h5 P0 r
procedure land(); override; 0 @" Q% [4 h0 F6 I, s4 B
function modal() : string; override; % B* I3 |$ z9 K
end; ) e% I) n$ O) o9 v
jet = class(plane) 7 O" o' u! u' s% E4 e1 r
private
1 M- ]6 k" F" I4 _' D, H fModal : String;
6 N0 q9 i6 ~, ~) u public 7 y* v. \, S3 |2 n( \' C8 q
constructor Create();
% s. s; r. I6 L. A7 l+ \( P: ^ destructor Destroy(); override;
$ ?+ {" f$ H$ g6 q( I6 Y# ?( t procedure fly(); override;
2 J! G b* G; g7 _) L! e procedure land(); override;
) B; v+ F+ C6 S6 P! m4 Q" {0 D function modal() : string; override;
7 T; ~5 _8 @( `. C. ~/ W: _ end;
4 C# A9 J7 X* U! [2 | 此刻,我们要完成一个飞机节制系统,有一个全局的函数 plane_fly,它负责让传递给它的飞机起飞,那么,只需要这样:
/ ?) Z* J' y8 ]" X* A procedure plane_fly(const pplane : plane);
! i! V+ h3 H j- p: v begin
# Z7 J( w8 c' |) Y4 l# @0 f pplane.fly(); 6 d6 d5 g: ` f# m6 c' [
end;
5 u+ S5 k% v6 z2 y0 k 就可以让所有传给它的飞机(plane的子类对象)正常起飞!不管是直升机仍是喷气机,甚至是此刻还不存在的,往后会增添的飞碟。因为,每个子类都已经界说了自己的起飞体例。 * M! r" p) I$ P1 @7 _
可以看到 plane_fly函数接管参数的是 plane类对象引用,而现实传递给它的都是 plane的子类对象,此刻回忆一下开首所描述的“多态”:多态性是承诺你将父对象设置成为和一个或更多的他的子对象相等的手艺,赋值之后,父对象就可以按照当前赋值给它的子对象的特征以分歧的体例运作。 ' D( y8 b5 I* f f
很显然,parent = child; 就是多态的本色!因为直升机“是一种”飞机,喷气机也“是一种”飞机,是以,所有对飞机的操作,都可以对它们操作,此时,飞机类就作为一种接口。 & j; A! K" g& `1 V; d
多态的素质就是将子类类型的指针赋值给父类类型的指针(在OP中是引用),只要这样的赋值发生了,多态也就发生了,因为实施了“向上映射”。
- k/ W3 D' o3 u5 q0 w6 u5 w2 d 应用多态的例子很是普遍,在Delphi的VCL类库中,最典型的就是:TObject类有一个虚拟的Destroy虚构函数和一个非虚拟的Free函数。Free函数中是挪用Destroy的。是以,当我们对任何对象(都是TObject的子类对象)挪用 .Free();之后,城市执行 TObject.Free();,它会挪用我们所使用的对象的析构函数 Destroy();。这就保证了任何类型的对象都可以正确地被析构。 多态性作为面向对象最主要的特征,本文所提不外是牛之一毛,还有良多内容,期待巨匠来挖掘。 |