unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TDuck = class
public
procedure Quack; virtual;
end;
TDuckCanFly = class(TDuck)
private
duck: TDuck;
public
constructor Create(AOwner: TObject; ADuck: TDuck);
procedure Quack; override;
end;
TDuckCanSwim = class(TDuck)
private
duck: TDuck;
public
constructor Create(AOwner: TObject; ADuck: TDuck);
procedure Quack; override;
end;
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure Log(msg: string);
begin
Form1.ListBox1.Items.Add(msg);
end;
{ TDuck }
procedure TDuck.Quack;
begin
Log('TDuck.Quack');
end;
{ TDuckCanFly }
constructor TDuckCanFly.Create(AOwner: TObject; ADuck: TDuck);
begin
duck := ADuck;
end;
procedure TDuckCanFly.Quack;
begin
Log('TDuckCanFly.Quack: I Can Fly');
duck.Quack;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Duck: TDuck;
FlyDuck: TDuck;
SwimDuck: TDuck;
begin
Duck := TDuck.Create;
FlyDuck := TDuckCanFly.Create(Self, Duck);
SwimDuck := TDuckCanSwim.Create(Self, FlyDuck);
SwimDuck.Quack;
SwimDuck.Destroy;
FlyDuck.Destroy;
Duck.Destroy;
end;
{ TDuckCanSwim }
constructor TDuckCanSwim.Create(AOwner: TObject; ADuck: TDuck);
begin
duck := ADuck;
end;
procedure TDuckCanSwim.Quack;
begin
inherited;
Log('TDuckCanSwim.Quack: I Can Swim');
duck.Quack;
end;
end.
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TDuck = class
public
procedure Quack; virtual;
end;
TDuckCanFly = class(TDuck)
private
duck: TDuck;
public
constructor Create(AOwner: TObject; ADuck: TDuck);
procedure Quack; override;
end;
TDuckCanSwim = class(TDuck)
private
duck: TDuck;
public
constructor Create(AOwner: TObject; ADuck: TDuck);
procedure Quack; override;
end;
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure Log(msg: string);
begin
Form1.ListBox1.Items.Add(msg);
end;
{ TDuck }
procedure TDuck.Quack;
begin
Log('TDuck.Quack');
end;
{ TDuckCanFly }
constructor TDuckCanFly.Create(AOwner: TObject; ADuck: TDuck);
begin
duck := ADuck;
end;
procedure TDuckCanFly.Quack;
begin
Log('TDuckCanFly.Quack: I Can Fly');
duck.Quack;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Duck: TDuck;
FlyDuck: TDuck;
SwimDuck: TDuck;
begin
Duck := TDuck.Create;
FlyDuck := TDuckCanFly.Create(Self, Duck);
SwimDuck := TDuckCanSwim.Create(Self, FlyDuck);
SwimDuck.Quack;
SwimDuck.Destroy;
FlyDuck.Destroy;
Duck.Destroy;
end;
{ TDuckCanSwim }
constructor TDuckCanSwim.Create(AOwner: TObject; ADuck: TDuck);
begin
duck := ADuck;
end;
procedure TDuckCanSwim.Quack;
begin
inherited;
Log('TDuckCanSwim.Quack: I Can Swim');
duck.Quack;
end;
end.