مصطفی ساتکی
یک شنبه 27 تیر 1389, 09:21 صبح
سلام به تعريف كلاس هاي زير نگاه كنيد.براينكه Media رو تو كلاس هاي ClassA ,ClassB مجدداً تعريف نكنم چه راهي پيشنهاد مي ديد.تعريف كنم جايگزين بشه اينطوري خصيصه مشابه در كلاس بالاتر هم داره منابع اشغال مي كنه كه بايستي Free بشه.
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
tMedia= Class
private
public
Msg : string;
Constructor Create;virtual;
End;
tMediaA= Class(tMedia)
public
Constructor Create;override;
End;
tMediaB= Class(tMedia)
public
Constructor Create;override;
End;
Tbase = Class(TComponent)
private
FMedia : tMedia;
public
property Media : tMedia read FMedia;
constructor Create(AOwner : TComponent);override;
End;
TClassA = Class(Tbase)
private
FMedia : tMediaA;
public
property Media : tMediaA read FMedia;
constructor Create(AOwner : TComponent);override;
End;
TClassB = Class(Tbase)
private
FMedia : tMediaB;
public
property Media : tMediaB read FMedia;
constructor Create(AOwner : TComponent);override;
End;
TForm4 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.Button1Click(Sender: TObject);
var a : TClassB;
begin
a := TClassB.Create(Self);
ShowMessage(a.Media.Msg);
end;
procedure TForm4.FormCreate(Sender: TObject);
begin
end;
{ tMediaB }
constructor tMediaB.Create;
begin
inherited;
Msg := 'MediaB';
end;
{ tMedia }
constructor tMedia.Create;
begin
Msg := 'Media';
end;
{ tMediaA }
constructor tMediaA.Create;
begin
inherited;
Msg := 'MediaA';
end;
{ Tbase }
constructor Tbase.Create(AOwner: TComponent);
begin
inherited;
FMedia := tMedia.Create;
end;
{ TClassA }
constructor TClassA.Create(AOwner: TComponent);
begin
inherited;
if Assigned(FMedia) then
begin
FMedia.Free;
FMedia := nil;
end;
FMedia := tMediaA.Create;
end;
{ TClassB }
constructor TClassB.Create(AOwner: TComponent);
begin
inherited;
if Assigned(FMedia) then
begin
FMedia.Free;
FMedia := nil;
end;
FMedia := tMediaB.Create;
end;
end.
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
tMedia= Class
private
public
Msg : string;
Constructor Create;virtual;
End;
tMediaA= Class(tMedia)
public
Constructor Create;override;
End;
tMediaB= Class(tMedia)
public
Constructor Create;override;
End;
Tbase = Class(TComponent)
private
FMedia : tMedia;
public
property Media : tMedia read FMedia;
constructor Create(AOwner : TComponent);override;
End;
TClassA = Class(Tbase)
private
FMedia : tMediaA;
public
property Media : tMediaA read FMedia;
constructor Create(AOwner : TComponent);override;
End;
TClassB = Class(Tbase)
private
FMedia : tMediaB;
public
property Media : tMediaB read FMedia;
constructor Create(AOwner : TComponent);override;
End;
TForm4 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.Button1Click(Sender: TObject);
var a : TClassB;
begin
a := TClassB.Create(Self);
ShowMessage(a.Media.Msg);
end;
procedure TForm4.FormCreate(Sender: TObject);
begin
end;
{ tMediaB }
constructor tMediaB.Create;
begin
inherited;
Msg := 'MediaB';
end;
{ tMedia }
constructor tMedia.Create;
begin
Msg := 'Media';
end;
{ tMediaA }
constructor tMediaA.Create;
begin
inherited;
Msg := 'MediaA';
end;
{ Tbase }
constructor Tbase.Create(AOwner: TComponent);
begin
inherited;
FMedia := tMedia.Create;
end;
{ TClassA }
constructor TClassA.Create(AOwner: TComponent);
begin
inherited;
if Assigned(FMedia) then
begin
FMedia.Free;
FMedia := nil;
end;
FMedia := tMediaA.Create;
end;
{ TClassB }
constructor TClassB.Create(AOwner: TComponent);
begin
inherited;
if Assigned(FMedia) then
begin
FMedia.Free;
FMedia := nil;
end;
FMedia := tMediaB.Create;
end;
end.