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.
    
  • 相关阅读:
    立体匹配算法(转载)
    校招总结
    tcpip概述
    Matlab2014a 提示未找到支持的编译器或 SDK的解决方法
    CSS3 实现简单轮播图
    css3实现switch开关效果
    Sass的使用和基础语法
    Git的安装和使用记录
    jQuery淡入淡出效果轮播图
    JavaScript焦点轮播图
  • 原文地址:https://www.cnblogs.com/del/p/1034529.html
Copyright © 2011-2022 走看看