Delphi 系统[25]关键字和保留字 override、overload、reintroduce、inherited
Delphi 系统[25]关键字和保留字 override、overload、reintroduce、inherited
1、定义:
- override :指示子类覆写父类的一个 virtual 或 dynamic 方法。覆盖时必须沿用被覆盖方法的声明,并且不允许修改原方法的参数和返回类型。
- overload :指示重载一个同名函数、过程或方法。重载的同名方法时,必须具备“参数、类型或顺序不同”的条件。调用重载方法时,根据输入的参数不同来调用不同的重载方法。
- reintroduce :指示重新发布父类的方法。如果要覆盖的方法是静态方法,或是需要修改方法的参数等,必须用 reintroduce 进行重发布。对于 virtual 或dynamic 方法,可以直接用 override 进行覆盖。
- inherited :调用父类的方法。
2、示例:
{ override 覆写父类的方法 }
type
{ 父类定义三个方法,其中两个可以被覆写,一个抽象方法 }
TMyObjectA = class(TObject)
protected
procedure Test1; virtual; {virtual 定义虚方法}
public
function Test2: string; dynamic; abstract; {dynamic 定义动态方法 + abstract 抽象方法}
function Test3: Integer;
end;
{ 子类继承父类的三个,同时将其中两个改写 }
TMyObjectB = class(TMyObjectA)
protected
procedure Test1; override; {覆写 父类A 的 Test1 }
public
function Test2: string; override; {覆写 父类A 的 Test2 }
end;
{ 父类A - Test1方法1}
procedure TMyObjectA.Test1;
begin
ShowMessage('A');
end;
{ 父类A - Test2 方法2 }
{ abstract 抽象方法只定义,不实现 }
{ 父类A - Test3 方法3 }
function TMyObjectA.Test3: Integer;
begin
Result := 1;
end;
{ 子类B - 重写方法1 }
procedure TMyObjectB.Test1;
begin
ShowMessage('B');
end;
{ 子类B - 重写方法2 这里注意,子类重写了 Test2}
function TMyObjectB.Test2: string;
begin
Result := 'B';
end;
{ 测试--调用各个方法 }
procedure TForm1.Button1Click(Sender: TObject);
var
MyObjB: TMyObjectB;
begin
{ 测试子类 }
MyObjB := TMyObjectB.Create;
try
MyObjB.Test1; //B
Caption := MyObjB.Test2 + IntToStr(MyObjB.Test3); //B1
finally
MyObjB.Free;
end;
end;
----------------------------------------------------------------------------------------
{ overload 重载函数 }
function ShowInfo(Info: Boolean): string; overload;
begin
ShowMessage(BoolToStr(Info, True));
end;
function ShowInfo(Info: Integer): string; overload;
begin
ShowMessage(IntToStr(Info));
end;
function ShowInfo(Info: string): string; overload;
begin
ShowMessage(Info);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowInfo('你好! 滔Roy');
ShowInfo(123456);
ShowInfo(False);
end;
---------------------------------------------------------------------------------------
{ reintroduce 重新发布父类的方法 }
type
TMyObjectA = class { 父类 }
procedure Test;
end;
TMyObjectB = class(TMyObjectA) { 子类 }
procedure Test; reintroduce;
end;
TMyObjectC = class(TMyObjectB) { 孙类 }
procedure Test(I: Integer); reintroduce;
end;
---------------------------------------------------------------------------------------
{inherited 继承, 调用父类方法 }
type
TMyObjectA = class(TObject) { 父类 }
public
procedure Test1; virtual;
procedure Test2; virtual;
end;
TMyObjectB = class(TMyObjectA) { 子类 }
public
procedure Test1; override;
end;
procedure TMyObjectA.Test1; { 父类 - 虚拟方法1 }
begin
ShowMessage('父类方法 1');
end;
procedure TMyObjectA.Test2; { 父类 - 虚拟方法2 }
begin
ShowMessage('父类方法 2');
end;
procedure TMyObjectB.Test1; { 子类 - 覆写父类方法1 }
begin
inherited; { 调用父类方法中的同名方法,即 Test1 }
inherited Test2; { 调用父类方法中的 Test2 }
ShowMessage('子类方法 1');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
MyObjB: TMyObjectB;
begin
MyObjB := TMyObjectB.Create;
try
MyObjB.Test1;
finally
MyObjB.Free;
end;
end;
3、关于 overload 和 reintroduce 的一些使用说明:
可以使用重载指令重新声明方法。在这种情况下,如果重新声明的方法具有与其祖先不同的参数签名,则会重载继承的方法而不隐藏它。在子类中调用该方法将激活与调用中的参数匹配的任何实现。
如果重载虚拟方法,请在子类中重新声明它时使用 reintroduce 指令。例如:
type
T1 = class(TObject)
procedure Test(I: Integer); overload; virtual;
end;
T2 = class(T1)
procedure Test(S: string); reintroduce; overload;
end;
...
SomeObject := T2.Create;
SomeObject.Test('Hello! TaoRoy'); // calls T2.Test
SomeObject.Test(9); // calls T1.Test
在一个类中,不能发布具有相同名称的多个重载方法。运行时类型信息的维护要求每个已发布成员具有唯一的名称。
type
TSomeClass = class
published
function Func(P: Integer): Integer;
function Func(P: Boolean): Integer //错误的X error
不能重载用作属性读或写说明符的方法。
重载方法的实现必须重复类声明中的参数列表。有关重载的更多信息,请参阅重载过程和函数。
reintroduce 指令禁止编译器发出关于隐藏以前声明的虚拟方法的警告。例如:
procedure DoSomething; reintroduce; //祖先类还有一个DoSomething方法
如果要用新方法隐藏继承的虚拟方法,请使用reintroduce。
创建时间:2021.08.16 更新时间: