Subscribe

RSS Feed (xml)

Powered By

Skin Design:
Free Blogger Skins

Powered by Blogger

星期一, 10月 29, 2007

物件 : 繼承性(二)

1. unit1有Tc1及Tc2類別,Tc2類別是繼承Tc1,因屬同一個unit底下,所以所有的屬性(public、private及protected)皆可以被呼叫。

2. unit2若單純uses unit1的話,Tc1類別的public,Tc2類別的public,及Tc類別所繼承父的public。

3. unit2有Tc3類別,其為繼承Tc2,則只能呼叫public及protected,但是不能呼叫private。在此須注意uses要放在interface裡,不能放在implementation裡。

uint1.pas

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
Tc1 = class
public
public_c1: string;
private
private_c1: string;
protected
protected_c1: string;
end;
type
Tc2 = class(Tc1)
public
public_c2: string;
private
private_c2: string;
protected
protected_c2: string;
end;
var
Form1: TForm1;
c2: Tc2;
c1: Tc1;
implementation
uses Unit2;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
c2 := Tc2.Create;
c2.public_c2:='a';
c2.private_c2:='b';
c2.protected_c2:='c';
c2.public_c1:='d'; //都可以存取,主要是繼承Tc1
c2.private_c1:='e';
c2.protected_c1:='f';
c1 := Tc1.Create;
c1.public_c1:='aa';
c1.private_c1:='bb';
c1.protected_c1:='cc';
// 各位要觀察的是 c2或c1物件按下.的時候可以下拉哪些 function
end;

end.

uint2.pas

unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, unit1;

//因為要繼承 Tc2,所以引用的 unit1 單元須寫在 class type的宣告之前,所以須
//寫在 interface 區
type
TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
Tc3= class(Tc2) //因為在interface 就需要Tc2,所以unit1要寫在interface上面喔
public
public_c3: string;
private
private_c3: string;
protected
protected_c3: string;
end;
var
Form2: TForm2;
implementation
//uses Unit1; //不能寫implemetation後面
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
// 只有 public 區的資料可以被讀取
c1.public_c1:='a';
c2.public_c1 :='b';
c2.public_c2 := 'c';
end;
procedure TForm2.Button2Click(Sender: TObject);
var c3: Tc3;
begin
c3:= Tc3.Create;
c3.public_c3 := 'a';
c3.private_c3:= 'a';
c3.protected_c3:= 'a';

c3.public_c2:= 'a';
c3.protected_c2:= 'a';

c3.public_c1 := 'a';
c3.protected_c1:= 'a';
// 有沒有發現Tc2及Tc1內的private變數無法經由繼承的方式來讀取,
// 但是protected 的資料卻可存取
// 記得如果是Tc2與Tc3在同一個 unit,則 private 變數仍可存取

end;
end.


有繼承的類別,若有與父類別相同的程序(屬性)則將會覆蓋掉父類別的程序(屬性)

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
Tc1 = class
public
public_c1: string;
procedure public_p1;
private
private_c1: string;
protected
protected_c1: string;
end;
type
Tc2 = class(Tc1)
public
public_c2: string;
procedure public_p1;
procedure public_p2;
private
private_c2: string;
protected
protected_c2: string;
end;
var
Form1: TForm1;
c2: Tc2;
c1: Tc1;
implementation
uses Unit2;
{$R *.dfm}
procedure Tc1.public_p1;
begin
showmessage('Tc1.p1');
end;

procedure Tc2.public_p1;
begin
showmessage('Tc2.p1');
end;

procedure Tc2.public_p2;
begin
showmessage('Tc2.p2');
end;

procedure TForm1.Button1Click(Sender: TObject);
var c1:Tc1;
c2:Tc2;
begin
c1:=Tc1.create;
c2:=Tc2.Create;
c1.public_p1; //Tc1.p1
c2.public_p1; //Tc2.p1 有相同的子類別會覆蓋掉父類別的程序(屬性)
c2.public_p2; //Tc2.p2
end;

end.

沒有留言: