静态方法 和 virtual ,Dynamic,override 的理解
参考万一老师: http://www.cnblogs.com/del/archive/2007/12/17/1002959.html
理解如下:
TBase = class
procedure proc1; virtual;
procedure proc2;
end;
TChild = class(TBase)
procedure proc1; override;
procedure proc2;
end;
procedure TBase.proc1;
begin ShowMessage('B1');
end;
procedure TBase.proc2;
begin
ShowMessage('B2');
end;
{ TChild }
procedure TChild.proc1;
begin
//inherited;
ShowMessage('C1');
end;
procedure TChild.proc2;
begin
ShowMessage('C2');
end;
{
静态方法 : 编译期绑定
virtual,dynamic 虚方法 运行期绑定,谁创建就绑定到谁的方法上。
}
procedure TForm1.btn7Click(Sender: TObject);
var
B: TBase;
C: TChild;
BC: TBase;
begin
B := TBase.Create;
C := TChild.Create;
BC := TChild.Create;
B.proc1; //B1 TBase.proc1
B.proc2; //B2 TBase.proc2
TChild(B).proc1; //B1 虚方法动态绑定到B 的创建类TBase上 TBase.proc1
TChild(B).proc2; //C2 静态方法编译期绑定到 TChild.proc2
C.proc1; //C1 绑定到 TChild.proc1
C.proc2; //C2 绑定到 TChild.proc2
TBase(C).proc1; //C1 虚方法动态绑定到 TChild.TChild
TBase(C).proc2; //B2 静态方法编译期绑定到 TBase.proc2
BC.proc1; //C1 虚方法动态绑定到 TChild.proc1
BC.proc2; //B2 静态方法编译期绑定到 TBase.proc2
TBase(BC).proc1; //C1 虚方法绑定到 TChild.proc1
TBase(BC).proc2; //B2 静态方法绑定到 TBase.proc2
TChild(BC).proc1; //C1 绑定到 TChild.proc1
TChild(BC).proc2; //C2 静态方法绑定到 TChild
B.Free;
C.Free;
BC.Free;
end;