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.
    
  • 相关阅读:
    html5 localstorage本地存储
    如何在源码里修改openwrt root密码
    openwrt-scripts/config/mconf: Syntax error: “(” unexpected错误解决
    HTML5获取地理位置信息
    Mysql 查看连接数,状态 最大并发数(赞)
    晨读笔记:CSS3选择器之属性选择器
    CSS3选择器之属性选择器
    js判断浏览器类型
    javascript json字符串与对象相互转换
    手机端html5触屏事件(touch事件)
  • 原文地址:https://www.cnblogs.com/del/p/1034529.html
Copyright © 2011-2022 走看看