zoukankan      html  css  js  c++  java
  • 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  更新时间:

    博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你所有帮助,谢谢!
  • 相关阅读:
    JS产生随机数的几个用法!
    title与alt的区别
    jquery select取值,赋值操作
    DIV+CSS中标签dl dt dd常用的用法
    vi/vim键盘图
    win7系统注册表的权限修改
    win7 链接打印机时提示未知的用户名或错误密码
    关于无法把程序(Adobe Fireworks CS5)添加到打开方式的解决办法
    把网页发送到桌面代码
    iframe多层嵌套时获取元素总结
  • 原文地址:https://www.cnblogs.com/guorongtao/p/15146472.html
Copyright © 2011-2022 走看看