zoukankan      html  css  js  c++  java
  • 02.Delphi通过接口实现多重继承

    uSayHello类如下:

    unit uSayHello;
    
    interface
    
    type
      // 接口
      IGreetable = interface
        ['{D91DDE09-0FC4-4FE9-AE0D-9877E2F73BF6}']
        // 输出函数
        function SayHello: string;
      end;
    
      // TInterfacedObject实现了接口的默认方法
      TMan = class(TInterfacedObject)
        // 语言,姓名,皮肤颜色 属性
        Language: string;
        Name: string;
        SkinColor: string;
      public
        // 虚方法virtual, 子类需要使用override来覆盖
        constructor create; virtual;
      end;
    
      // 通过接口,继承了TMan的Create同时也继承了TGreetable的SayHello
      TChinese = class(TMan, IGreetable)
      public
        constructor create; override;
      private
        function SayHello: string;
      end;
    
      TAmerican = class(TMan, IGreetable)
      public
        constructor create; override;
      private
        function SayHello: string;
      end;
    
      TFrench = class(TMan, IGreetable)
      public
        constructor create; override;
      private
        function SayHello: string;
      end;
    
      TKorean = class(TMan, IGreetable)
      public
        constructor create; override;
      private
        function SayHello: string;
      end;
    
    implementation
    
    constructor TMan.create;
    begin
      Name := '张三';
      Language := '中文';
      SkinColor := '黄色';
    end;
    
    constructor TChinese.create;
    begin
      inherited;
    end;
    
    constructor TAmerican.create;
    begin
      Name := 'Lee';
      Language := '英文';
      SkinColor := '黑色';
    end;
    
    constructor TFrench.create;
    begin
      Name := '苏菲';
      Language := '法文';
      SkinColor := '白色';
    end;
    
    constructor TKorean.create;
    begin
      Name := '金知中';
      Language := '韩文';
      SkinColor := '黄色';
    end;
    
    function TChinese.SayHello;
    begin
      Result := 'chinese.bmp';
    end;
    
    function TAmerican.SayHello;
    begin
      Result := 'American.bmp';
    end;
    
    function TFrench.SayHello;
    begin
      Result := 'French.bmp';
    end;
    
    function TKorean.SayHello;
    begin
      Result := 'Korean.bmp';
    end;
    
    end.

    界面代码如下,接口调用函数的参数,使用父内函数。接口传参的时候,用子类传参数。

    unit ufrmSayHello;
    
    interface
    
    uses
      Windows,
      Messages,
      SysUtils,
      Variants,
      Classes,
      Graphics,
      Controls,
      Forms,
      Dialogs,
      StdCtrls,
      ExtCtrls,
      uSayHello;
    
    type
      TfrmSayHello = class(TForm)
        GroupBox1: TGroupBox;
        edtName: TLabeledEdit;
        edtSkinColor: TLabeledEdit;
        edtLanguage: TLabeledEdit;
        btnUSA: TButton;
        btnKorean: TButton;
        btnCN: TButton;
        btnFrench: TButton;
        Image1: TImage;
        procedure btnUSAClick(Sender: TObject);
        procedure btnCNClick(Sender: TObject);
        procedure btnFrenchClick(Sender: TObject);
        procedure btnKoreanClick(Sender: TObject);
      private
        procedure sayhello(AMan: TMan; G: IGreetable);
      public
        { Public declarations }
      end;
    
    var
      frmSayHello: TfrmSayHello;
    
    implementation
    
    {$R *.dfm}
    
    // 多个不同参数的函数,集成到了一个
    procedure TfrmSayHello.sayhello(AMan: TMan; G: IGreetable);
    begin
      // 类实现的多态
      edtName.Text := AMan.Name;
      edtLanguage.Text := AMan.Language;
      edtSkinColor.Text := AMan.SkinColor;
      // 接口实现的多态
      Image1.Picture.LoadFromFile(G.sayhello);
    end;
    
    procedure TfrmSayHello.btnUSAClick(Sender: TObject);
    var
      G: IGreetable;
      AMan: TMan;
    begin
      // 按照父类定义,子类创建
      AMan := TAmerican.create;
      G := TAmerican.create;
      sayhello(AMan, G);
    end;
    
    procedure TfrmSayHello.btnCNClick(Sender: TObject);
    begin
      // sayhello很神奇的地方在于,不同的类型参数都可以传过去,不用因为参数不同,就需要声明不同的sayhello函数
      sayhello(TChinese.create, TChinese.create);
    end;
    
    procedure TfrmSayHello.btnFrenchClick(Sender: TObject);
    begin
      sayhello(TFrench.create, TFrench.create);
    end;
    
    procedure TfrmSayHello.btnKoreanClick(Sender: TObject);
    begin
      sayhello(TKorean.create, TKorean.create);
    end;
    
    end.
  • 相关阅读:
    Android:android sdk源码中怎么没有httpclient的源码了
    Android:ADB server didn't ACK或者adb server is out of date. killing解决办法
    [GitHub]第八讲:GitHub Pages
    [GitHub]第七讲:GitHub issues
    [GitHub]第六讲:开源项目贡献流程
    php反射类 ReflectionClass
    排名前 8 的 PHP 调试工具,你认可吗?
    如何调试PHP程序
    eclipse 快速建立PHP调试环境
    HTML 列表元素OL、UL、LI
  • 原文地址:https://www.cnblogs.com/tianpan2019/p/11471138.html
Copyright © 2011-2022 走看看