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  更新时间:

相关