Chinaunix首页 | 论坛 | 博客
  • 博客访问: 504606
  • 博文数量: 106
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-21 09:35
文章分类

全部博文(106)

文章存档

2010年(3)

2009年(14)

2008年(55)

2007年(34)

我的朋友

分类:

2010-01-02 13:25:49

相关对象实现多态性的实现,必须具备如下三个条件:

·对象之间具有继承关系。

·基类和派生类拥有通过特殊方式联系起来的相同的方法。

·基类变量可以引用派生类对象实例。

要实现相关对象在多态性,首先需要声明一个包含虚拟或者动态方法的基类,然后声明覆盖基类中虚拟或动态方法的派生类。这样就满足了实现多态的前两个条件,至于第三个条件,实际上,在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.

 

 

运行结果:

阅读(1056) | 评论(0) | 转发(1) |
1

上一篇:无法为更新定位行

下一篇:作用域

给主人留下些什么吧!~~