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

uSayHello代码如下

  1. unit uSayHello;
  2.  
  3. interface
  4.  
  5. type
  6. // 接口
  7. IGreetable = interface
  8. ['{D91DDE09-0FC4-4FE9-AE0D-9877E2F73BF6}']
  9. // 输出函数
  10. function SayHello: string;
  11. end;
  12.  
  13. // TInterfacedObject实现了接口的默认方法
  14. TMan = class(TInterfacedObject)
  15. // 语言,姓名,皮肤颜色 属性
  16. Language: string;
  17. Name: string;
  18. SkinColor: string;
  19. public
  20. // 虚方法virtual, 子类需要使用override来覆盖
  21. constructor create; virtual;
  22. end;
  23.  
  24. // 通过接口,继承了TMan的Create同时也继承了TGreetable的SayHello
  25. TChinese = class(TMan, IGreetable)
  26. public
  27. constructor create; override;
  28. private
  29. function SayHello: string;
  30. end;
  31.  
  32. TAmerican = class(TMan, IGreetable)
  33. public
  34. constructor create; override;
  35. private
  36. function SayHello: string;
  37. end;
  38.  
  39. TFrench = class(TMan, IGreetable)
  40. public
  41. constructor create; override;
  42. private
  43. function SayHello: string;
  44. end;
  45.  
  46. TKorean = class(TMan, IGreetable)
  47. public
  48. constructor create; override;
  49. private
  50. function SayHello: string;
  51. end;
  52.  
  53. implementation
  54.  
  55. constructor TMan.create;
  56. begin
  57. Name := '张三';
  58. Language := '中文';
  59. SkinColor := '黄色';
  60. end;
  61.  
  62. constructor TChinese.create;
  63. begin
  64. inherited;
  65. end;
  66.  
  67. constructor TAmerican.create;
  68. begin
  69. Name := 'Lee';
  70. Language := '英文';
  71. SkinColor := '黑色';
  72. end;
  73.  
  74. constructor TFrench.create;
  75. begin
  76. Name := '苏菲';
  77. Language := '法文';
  78. SkinColor := '白色';
  79. end;
  80.  
  81. constructor TKorean.create;
  82. begin
  83. Name := '金知中';
  84. Language := '韩文';
  85. SkinColor := '黄色';
  86. end;
  87.  
  88. function TChinese.SayHello;
  89. begin
  90. Result := 'chinese.bmp';
  91. end;
  92.  
  93. function TAmerican.SayHello;
  94. begin
  95. Result := 'American.bmp';
  96. end;
  97.  
  98. function TFrench.SayHello;
  99. begin
  100. Result := 'French.bmp';
  101. end;
  102.  
  103. function TKorean.SayHello;
  104. begin
  105. Result := 'Korean.bmp';
  106. end;
  107.  
  108. end.

ufrmSayHello代码如下

  1. unit ufrmSayHello;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows,
  7. Messages,
  8. SysUtils,
  9. Variants,
  10. Classes,
  11. Graphics,
  12. Controls,
  13. Forms,
  14. Dialogs,
  15. StdCtrls,
  16. ExtCtrls,
  17. uSayHello;
  18.  
  19. type
  20. TfrmSayHello = class(TForm)
  21. GroupBox1: TGroupBox;
  22. edtName: TLabeledEdit;
  23. edtSkinColor: TLabeledEdit;
  24. edtLanguage: TLabeledEdit;
  25. btnUSA: TButton;
  26. btnKorean: TButton;
  27. btnCN: TButton;
  28. btnFrench: TButton;
  29. Image1: TImage;
  30. procedure btnUSAClick(Sender: TObject);
  31. procedure btnCNClick(Sender: TObject);
  32. procedure btnFrenchClick(Sender: TObject);
  33. procedure btnKoreanClick(Sender: TObject);
  34.  
  35. private
  36. procedure sayhello(AMan: TMan);
  37. public
  38. { Public declarations }
  39. end;
  40.  
  41. var
  42. frmSayHello: TfrmSayHello;
  43.  
  44. implementation
  45.  
  46. {$R *.dfm}
  47.  
  48. // 多个不同参数的函数,集成到了一个
  49. procedure TfrmSayHello.sayhello(AMan: TMan);
  50. var
  51. G: IGreetable;
  52. begin
  53. // 类实现的多态
  54. edtName.Text := AMan.Name;
  55. edtLanguage.Text := AMan.Language;
  56. edtSkinColor.Text := AMan.SkinColor;
  57. // as把某个类型对象转换成所需要的类型。 is是判断某对象是否是某类型。
  58. G := AMan as IGreetable;
  59. // 接口实现的多态
  60. Image1.Picture.LoadFromFile(G.sayhello);
  61. end;
  62.  
  63. procedure TfrmSayHello.btnUSAClick(Sender: TObject);
  64. begin
  65. // sayhello参数定义的父内,传入时传的子类,
  66. sayhello(TAmerican.create);
  67. end;
  68.  
  69. procedure TfrmSayHello.btnCNClick(Sender: TObject);
  70. begin
  71. sayhello(TChinese.create);
  72. end;
  73.  
  74. procedure TfrmSayHello.btnFrenchClick(Sender: TObject);
  75. begin
  76. sayhello(TFrench.create);
  77. end;
  78.  
  79. procedure TfrmSayHello.btnKoreanClick(Sender: TObject);
  80. begin
  81. sayhello(TKorean.create);
  82. end;
  83.  
  84. end.

03.Delphi通过接口实现多重继承的优化的更多相关文章

  1. 02.Delphi通过接口实现多重继承

    uSayHello类如下: unit uSayHello; interface type // 接口 IGreetable = interface ['{D91DDE09-0FC4-4FE9-AE0D ...

  2. Delphi 的接口机制——接口操作的编译器实现过程(1)

    学习COM编程技术也快有半个月了,这期间看了很多资料和别人的程序源码,也尝试了用delphi.C++.C#编写COM程序,个人感觉Delphi是最好上手的.C++的模版生成的代码太过复杂繁琐,大量使用 ...

  3. delphi中接口的委托和聚合

    Delphi的TRegistry注册表类 方法详解 Delphi的接口编程入门 delphi中接口的委托和聚合 2009-09-27 10:44:44|  分类: 默认分类 |  标签: |举报 |字 ...

  4. 03: zabbix API接口 对 主机、主机组、模板、应用集、监控项、触发器等增删改查

    目录:Django其他篇 01: 安装zabbix server 02:zabbix-agent安装配置 及 web界面管理 03: zabbix API接口 对 主机.主机组.模板.应用集.监控项. ...

  5. 05.Delphi接口的多重继承深入

    由于是IInterface,申明了SayHello,需要由继承类来实现函数,相对于03篇可以再精简一下 unit uSayHello; interface uses SysUtils, Windows ...

  6. 04.Delphi通过接口IInterface实现多重继承

    IInterface表示申明了一些函数,自己本身没有实现部分,需要由继承它的类来实现函数 uSayHello代码如下 unit uSayHello; interface uses SysUtils, ...

  7. C++解析(24):抽象类和接口、多重继承

    0.目录 1.抽象类和接口 1.1 抽象类 1.2 纯虚函数 1.3 接口 2.被遗弃的多重继承 2.1 C++中的多重继承 2.2 多重继承的问题一 2.3 多重继承的问题二 2.4 多重继承的问题 ...

  8. Delphi面向对象---接口

    从Delphi3开始支持接口.接口定义了能够与一个对象进行交互操作的一组过程和函数.对一个接口进行定义包含两个方面的内容: 1)一方面是实现这个接口 2)另一方面是定义接口的客户 一个类能够实现多个接 ...

  9. java中接口与多重继承的关系

    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...

随机推荐

  1. Atcoder Grand Contest 037C(贪心,优先队列,思维)

    #define HAVE_STRUCT_TIMESPEC//编译器中time.h和phread.h头文件中timespec结构体重名,故加此行#include<bits/stdc++.h> ...

  2. Linux centosVMware Nginx访问日志、Nginx日志切割、静态文件不记录日志和过期时间

    一.Nginx访问日志 vim /usr/local/nginx/conf/nginx.conf //搜索log_format  日至格式 改为davery格式 $remote_addr  客户端IP ...

  3. LCS(最长公共子序列)

    这个问题很有意思,在生物应用中,经常需要比较两个(或多个)不同生物体的DNA片段.例如,某种生物的DNA可能为S1 = ACCGGTCGAGTGCGCGGAAGCCGGCCGAA,S2 = GTCGT ...

  4. ch3 盒模型、定位

    标准盒模型.怪异盒模型 外边距叠加 当两个或者争夺垂直外边距相遇时,他们将形成一个外边距,这个外边距的高度等于两个发生叠加的外边距的高度中的较大者. 当一个元素出现在另一个元素上面时,第一个元素的底外 ...

  5. 记一次NoHttpResponseException问题排查

    上传文件程序会有一定的概率提示错误,错误率大概在1%以下,错误信息是:org.apache.http.NoHttpResponseException , s3-us-west-1.amazonaws. ...

  6. vmware workstation导入ovf文件报错:未通过OVF规范一致性或虚拟硬件合规性检查

    转自:https://blog.csdn.net/zs15yy/article/details/73793585 报错如下: 原因:这是因为OVF 版本不同导致的,VMware Workstation ...

  7. MyISAM/Innodb的区别

    MyISAM是MySQL的默认数据库引擎(5.5版之前).虽然性能极佳,而且提供了大量的特性,包括全文索引.压缩.空间函数等,但MyISAM不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复.不 ...

  8. 【MAVEN】maven项目下载更新pom jar包速度慢 解决方案

    1·下载安装 最新版本的maven https://maven.apache.org/download.cgi 2·速度慢的主要原因是因为默认setting.xml里配置的国外的 maven 数据源 ...

  9. Kubernetes 二进制部署(二)集群部署(多 Master 节点通过 Nginx 负载均衡)

    0. 前言 紧接上一篇,本篇文章我们尝试学习多节点部署 kubernetes 集群 并通过 haproxy+keepalived 实现 Master 节点的负载均衡 1. 实验环境 实验环境主要为 5 ...

  10. 剑指 offer 树的子结构

    题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构). 第一遍没写出来错误点:认为首先应该找到pRoot1等于pRoot2的节点,但是递归就是自己在不 ...