zoukankan      html  css  js  c++  java
  • 理解 Delphi 的类(七) 认识类的多态

    什么是多态? 我的理解就是: 同样一个方法, 在不同的对象里会有不同的实现, 仅此而已.
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      end;
    
      //定义了三个类, 后两个类都继承与第一个类 TBass
      TBass = class
        procedure alert; virtual; {加上 virtual 指示字, 说明这个方法可能会被修改(或叫覆盖)}
        {这种方法叫虚方法}
      end;
    
      TChild1 = class(TBass)
        procedure alert; override; {override 表示修改父类的同名方法}
      end;
    
      TChild2 = class(TBass)
        procedure alert; override;
      end;
    
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    { TBass }
    procedure TBass.alert;
    begin
      ShowMessage('is Bass');    {同一个方法, 在不同类里有不同的实现}
    end;
    
    { TChild1 }
    procedure TChild1.alert;
    begin
      ShowMessage('is TChild1'); {同一个方法, 在不同类里有不同的实现}
    end;
    
    { TChild2 }
    procedure TChild2.alert;
    begin
      ShowMessage('is TChild2'); {同一个方法, 在不同类里有不同的实现}
    end;
    
    
    //测试1:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      bass: TBass; {定义 TBass 的变量}
    begin
      bass := TBass.Create;
      bass.alert; {is Bass}
      bass.Free;
    end;
    
    //测试2:
    procedure TForm1.Button2Click(Sender: TObject);
    var
      bass: TBass;            {注意还是定义 TBass 的变量}
    begin
      bass := TChild1.Create; {但这里是通过 TChild1 建立对象}
      bass.alert; {is TChild1}
      bass.Free;
    end;
    
    //测试3:
    procedure TForm1.Button3Click(Sender: TObject);
    var
      bass: TBass;            {注意还是定义 TBass 的变量}
    begin
      bass := TChild2.Create; {但这里是通过 TChild2 建立对象}
      bass.alert; {is TChild2}
      bass.Free;
    end;
    
    {总结: 现在同是 bass.alert 方法, 通过不同对象的实现, 有了不同的功能, 这就是多态!}
    end.
    
  • 相关阅读:
    CF1008D Pave the Parallelepiped
    Luogu P3324 [SDOI2015]星际战争
    Luogu P3157 [CQOI2011]动态逆序对
    CF1295E Permutation Separation
    位元算
    JavaScript 寻找数组中的第N大的元素
    JS常见的数组排序算法
    最新面试总结
    JavaScript BOM浏览器对象模型
    JavaScript DOM 事件
  • 原文地址:https://www.cnblogs.com/del/p/1034529.html
Copyright © 2011-2022 走看看