覆盖虚方法
Code
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
//夫类
TParent = class
protected
function MyFun(i: Integer): Integer; dynamic; //动态方法
procedure MyProc; virtual; //虚方法
end;
//子类
TChild = class(TParent)
protected
function MyFun(i: Integer): Integer; override; //覆盖
procedure MyProc; override; //覆盖
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TParent }
function TParent.MyFun(i: Integer): Integer;
begin
Inc(i);
Result := i;
end;
procedure TParent.MyProc;
begin
ShowMessage('Parent');
end;
{ TChild }
function TChild.MyFun(i: Integer): Integer;
begin
i := inherited MyFun(i); //先调用夫类方法,被 +1;当然可以不调用
Inc(i); //子类再 +1
Result := i;
end;
procedure TChild.MyProc;
begin
inherited; //先调用夫类方法;当然可以不调用
ShowMessage('Child');
end;
//测试
procedure TForm1.FormCreate(Sender: TObject);
var
p: TParent;
c: TChild;
begin
p := TParent.Create;
c := TChild.Create;
p.MyProc; //Parent
c.MyProc; //Parent; TChild
ShowMessage(IntToStr(p.MyFun(2))); //3
ShowMessage(IntToStr(c.MyFun(2))); //4
p.Free;
c.Free;
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
//夫类
TParent = class
protected
function MyFun(i: Integer): Integer; dynamic; //动态方法
procedure MyProc; virtual; //虚方法
end;
//子类
TChild = class(TParent)
protected
function MyFun(i: Integer): Integer; override; //覆盖
procedure MyProc; override; //覆盖
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TParent }
function TParent.MyFun(i: Integer): Integer;
begin
Inc(i);
Result := i;
end;
procedure TParent.MyProc;
begin
ShowMessage('Parent');
end;
{ TChild }
function TChild.MyFun(i: Integer): Integer;
begin
i := inherited MyFun(i); //先调用夫类方法,被 +1;当然可以不调用
Inc(i); //子类再 +1
Result := i;
end;
procedure TChild.MyProc;
begin
inherited; //先调用夫类方法;当然可以不调用
ShowMessage('Child');
end;
//测试
procedure TForm1.FormCreate(Sender: TObject);
var
p: TParent;
c: TChild;
begin
p := TParent.Create;
c := TChild.Create;
p.MyProc; //Parent
c.MyProc; //Parent; TChild
ShowMessage(IntToStr(p.MyFun(2))); //3
ShowMessage(IntToStr(c.MyFun(2))); //4
p.Free;
c.Free;
end;
end.