相关对象实现多态性的实现,必须具备如下三个条件:
·对象之间具有继承关系。
·基类和派生类拥有通过特殊方式联系起来的相同的方法。
·基类变量可以引用派生类对象实例。
要实现相关对象在多态性,首先需要声明一个包含虚拟或者动态方法的基类,然后声明覆盖基类中虚拟或动态方法的派生类。这样就满足了实现多态的前两个条件,至于第三个条件,实际上,在Delphi中,派生类和它的基类是单向赋值兼容的,也就是说基类的变量能够引用它的任何派生类的对象实例,派生类的每个对象也都是基类的对象,但是,反过来是不行的。这种单向赋值兼容与现实世界的情景是一致的,比如:苹果类是水果类的派生类,任何苹果都是水果,但并非所有的水果都是苹果。
在基类中声明虚拟方法和动态方法是实现多态的前期,而在派生类中声明方法的覆盖则是实现多态的关键环节。
只有基类中的虚拟方法和动态方法才能在派生类中被覆盖。为了覆盖基类中的虚拟或动态方法,只要在派生类中重新声明希望覆盖的虚拟或动态方法并用指示字override来替换指示virtual或者dynamic就可以了。
例如:
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
{TBase}
TBase = class
procedure SMethod;virtual;
end;
{TDrive}
TDerive = class(TBase)
procedure SMethod; override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TBase }
procedure TBase.SMethod;
begin
Form1.ListBox1.Items.Add('基类的SMethod方法');
end;
{ TDerive }
procedure TDerive.SMethod;
begin
Form1.ListBox1.Items.Add('派生类的SMethod方法');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
BaseObject: TBase;
DeriveObject: TDerive;
begin
ListBox1.Items.Add('第一种情况:基类变量引用基类实例');
BaseObject := TBase.Create;
BaseObject.SMethod;
FreeAndNil(BaseObject);
ListBox1.Items.Add('');
ListBox1.Items.Add('第二种情况:派生类变量引用派生类实例');
DeriveObject := TDerive.Create;
DeriveObject.SMethod;
FreeAndNil(DeriveObject);
ListBox1.Items.Add('');
ListBox1.Items.Add('第三种情况:基类变量引用派生类实例');
BaseObject := TDerive.Create;
BaseObject.SMethod;
FreeAndNil(BaseObject);
end;
end.
|
运行结果:
阅读(1081) | 评论(0) | 转发(1) |