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.
  • 相关阅读:
    安装原版Win8.1并激活
    Java8 List<对象> 转 Set、Map(高级)、排序、分组、统计
    SpringCloud第二弹(高可用Eureka+Ribbon负载均衡)
    SpringCloud第一弹(入门)
    SpringBoot+Shiro+Redis共享Session入门小栗子
    Go语言(IDEA下+Eclipse下)Hello World
    Linux学习杂谈
    小孩儿才分对错,成年人只看利弊
    Xshell5
    91 Testing MySQL学习总结
  • 原文地址:https://www.cnblogs.com/tianpan2019/p/11471229.html
Copyright © 2011-2022 走看看