什麼是多態? 我的理解就是: 同樣一個方法, 在不同的對象裡會有不同的實現, 僅此而已.
unit Unit1;
//定義了三個類, 後兩個類都繼承與第一個類 TBass
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 = class
procedure alert; virtual;
{加上 virtual 指示字, 說明這個方法可能會被修改(或叫覆蓋)}
{這種方法叫虛方法} end;
//測試1:
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;procedure TForm1.Button1Click(Sender: TObject);
//測試2:
var
bass: TBass; {定義 TBass 的變量}
begin
bass := TBass.Create;
bass.alert; {is Bass}
bass.Free;
end;procedure TForm1.Button2Click(Sender: TObject);
//測試3:
var
bass: TBass; {注意還是定義 TBass 的變量}
begin
bass := TChild1.Create; {但這裡是通過 TChild1 建立對象}
bass.alert; {is TChild1}
bass.Free;
end;procedure TForm1.Button3Click(Sender: TObject);
{總結: 現在同是 bass.alert 方法, 通過不同對象的實現, 有了不同的功能, 這就是多態!}
var
bass: TBass; {注意還是定義 TBass 的變量}
begin
bass := TChild2.Create; {但這裡是通過 TChild2 建立對象}
bass.alert; {is TChild2}
bass.Free;
end;
end.