認識類的多態

什麼是多態? 我的理解就是: 同樣一個方法, 在不同的對象裏會有不同的實現, 僅此而已.


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  end;

  //定義了三個類, 後兩個類都繼承與第一個類 TBass
  TBass = class
    procedure alert; virtual; {加上 virtual 指示字, 說明這個方法可能會被修改(或叫覆蓋)}
    {這種方法叫虛方法}
  end;

  TChild1 = class(TBass)
    procedure alert; override; {override 表示修改父類的同名方法}
  end;

  TChild2 = class(TBass)
    procedure alert; override;
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TBass }
procedure TBass.alert;
begin
  ShowMessage('is Bass');    {同一個方法, 在不同類裏有不同的實現}
end;

{ TChild1 }
procedure TChild1.alert;
begin
  ShowMessage('is TChild1'); {同一個方法, 在不同類裏有不同的實現}
end;

{ TChild2 }
procedure TChild2.alert;
begin
  ShowMessage('is TChild2'); {同一個方法, 在不同類裏有不同的實現}
end;


//測試1:
procedure TForm1.Button1Click(Sender: TObject);
var
  bass: TBass; {定義 TBass 的變量}
begin
  bass := TBass.Create;
  bass.alert; {is Bass}
  bass.Free;
end;

//測試2:
procedure TForm1.Button2Click(Sender: TObject);
var
  bass: TBass;            {注意還是定義 TBass 的變量}
begin
  bass := TChild1.Create; {但這裏是通過 TChild1 建立對象}
  bass.alert; {is TChild1}
  bass.Free;
end;

//測試3:
procedure TForm1.Button3Click(Sender: TObject);
var
  bass: TBass;            {注意還是定義 TBass 的變量}
begin
  bass := TChild2.Create; {但這裏是通過 TChild2 建立對象}
  bass.alert; {is TChild2}
  bass.Free;
end;

{總結: 現在同是 bass.alert 方法, 通過不同對象的實現, 有了不同的功能, 這就是多態!}
end.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章