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

    在上一篇02中,写到的sayhello函数,需要使用2个接口参数,很繁琐。可以使用as参数,把多重继承的子类对象变成需要的对象

    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.

    ufrmSayHello代码如下

    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);
      public
        { Public declarations }
      end;
    
    var
      frmSayHello: TfrmSayHello;
    
    implementation
    
    {$R *.dfm}
    
    // 多个不同参数的函数,集成到了一个
    procedure TfrmSayHello.sayhello(AMan: TMan);
    var
      G: IGreetable;
    begin
      // 类实现的多态
      edtName.Text := AMan.Name;
      edtLanguage.Text := AMan.Language;
      edtSkinColor.Text := AMan.SkinColor;
      // as把某个类型对象转换成所需要的类型。 is是判断某对象是否是某类型。
      G := AMan as IGreetable;
      // 接口实现的多态
      Image1.Picture.LoadFromFile(G.sayhello);
    end;
    
    procedure TfrmSayHello.btnUSAClick(Sender: TObject);
    begin
      // sayhello参数定义的父内,传入时传的子类,
      sayhello(TAmerican.create);
    end;
    
    procedure TfrmSayHello.btnCNClick(Sender: TObject);
    begin
      sayhello(TChinese.create);
    end;
    
    procedure TfrmSayHello.btnFrenchClick(Sender: TObject);
    begin
      sayhello(TFrench.create);
    end;
    
    procedure TfrmSayHello.btnKoreanClick(Sender: TObject);
    begin
      sayhello(TKorean.create);
    end;
    
    end.
  • 相关阅读:
    SQL Server 创建触发器(trigger)
    jQuery插件-json2.js
    Opengl创建机器人手臂代码示例
    OpenGL超级宝典完整源码(第五版)
    基于Opengl的太阳系动画实现
    Opengl创建几何实体——四棱锥和立方体
    ubuntu16.04安装labelme
    Visual Studio Command Prompt 工具配置方法
    OpenNi安装示例
    Opencv读取图片像素值并保存为txt文件
  • 原文地址:https://www.cnblogs.com/tianpan2019/p/11471229.html
Copyright © 2011-2022 走看看