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.

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

  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. private
  35. procedure sayhello(AMan: TMan; G: IGreetable);
  36. public
  37. { Public declarations }
  38. end;
  39.  
  40. var
  41. frmSayHello: TfrmSayHello;
  42.  
  43. implementation
  44.  
  45. {$R *.dfm}
  46.  
  47. // 多个不同参数的函数,集成到了一个
  48. procedure TfrmSayHello.sayhello(AMan: TMan; G: IGreetable);
  49. begin
  50. // 类实现的多态
  51. edtName.Text := AMan.Name;
  52. edtLanguage.Text := AMan.Language;
  53. edtSkinColor.Text := AMan.SkinColor;
  54. // 接口实现的多态
  55. Image1.Picture.LoadFromFile(G.sayhello);
  56. end;
  57.  
  58. procedure TfrmSayHello.btnUSAClick(Sender: TObject);
  59. var
  60. G: IGreetable;
  61. AMan: TMan;
  62. begin
  63. // 按照父类定义,子类创建
  64. AMan := TAmerican.create;
  65. G := TAmerican.create;
  66. sayhello(AMan, G);
  67. end;
  68.  
  69. procedure TfrmSayHello.btnCNClick(Sender: TObject);
  70. begin
  71. // sayhello很神奇的地方在于,不同的类型参数都可以传过去,不用因为参数不同,就需要声明不同的sayhello函数
  72. sayhello(TChinese.create, TChinese.create);
  73. end;
  74.  
  75. procedure TfrmSayHello.btnFrenchClick(Sender: TObject);
  76. begin
  77. sayhello(TFrench.create, TFrench.create);
  78. end;
  79.  
  80. procedure TfrmSayHello.btnKoreanClick(Sender: TObject);
  81. begin
  82. sayhello(TKorean.create, TKorean.create);
  83. end;
  84.  
  85. end.

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

  1. 03.Delphi通过接口实现多重继承的优化

    在上一篇02中,写到的sayhello函数,需要使用2个接口参数,很繁琐.可以使用as参数,把多重继承的子类对象变成需要的对象 uSayHello代码如下 unit uSayHello; interf ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    接口对象的内存空间 假设我们定义了如下两个接口 IIntfA 和 IIntfB,其中 ProcA 和 ProcB 将实现为静态方法,而 VirtA 和 VirtB 将以虚方法实现: IIntfA =  ...

随机推荐

  1. cmd常用小命令

    #设置n秒后自动关机 -a取消 shutdown -s -t n #输出内容到fileName里,如果文件不存在将会创建文件,>是替换,>>是追加echo something > ...

  2. LXML解析html代码和文件

    from lxml import etree text = """ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...

  3. 洛谷P1091合唱队形(DP)

    题目描述 NNN位同学站成一排,音乐老师要请其中的(N−KN-KN−K)位同学出列,使得剩下的KKK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K1,2, ...

  4. Atcoder Grand Contest 037A(贪心,思维)

    #include<bits/stdc++.h>using namespace std;string s;char ans[200007][7];char anss[200007][7];i ...

  5. java面试题蚂蚁

    hashmap结构:什么对象能做为key hashtable,concurrentHashMap,hashtable比较 String,StringBuilder,StringBuffer 对象的深浅 ...

  6. Python 基础之面向对象之常用魔术方法

    一.__init__魔术属性 触发时机:实例化对象,初始化的时候触发功能:为对象添加成员,用来做初始化的参数:参数不固定,至少一个self参数返回值:无 1.基本用法 #例:class MyClass ...

  7. python使用pip安装库时出现timeout或者速度慢

    豆瓣:https://pypi.doubanio.com/simple/ pip3 install -i https://pypi.doubanio.com/simple/ selenium easy ...

  8. 大数据萌新的Python学习之路(二)

    笔记内容: 一.模块 Python越来越被广大程序员使用,越来越火爆的原因是因为Python有非常丰富和强大标准库和第三方库,几乎可以实现你所想要实现的任何功能,并且都有相应的Python库支持,比如 ...

  9. 创建Git本地仓库

    一.获取Git仓库 安装好Git后即可创建Git本地仓库,开始项目的版本管理.有两种方法取得Git项目仓库:1.在现有项目或目录下导入所有文件到Git中:2.从一个服务器克隆一个现有的Git仓库. 1 ...

  10. 使用loadrunner监控apcahe资源

    一般要修改的内容在Httpd.conf文件中已经存在,如果不存在请自行添加相应内容. (1)修改Apache中Httpd.conf文件, (2)添加ExtendedStatus,设置ExtendedS ...