IInterface表示申明了一些函数,自己本身没有实现部分,需要由继承它的类来实现函数

uSayHello代码如下

unit uSayHello;

interface

uses
SysUtils,
Windows,
Messages,
Classes,
Graphics,
Controls,
Forms,
Dialogs; type
// IInterface表示申明了一些函数,自己本身没有实现部分,需要由继承它的类来实现函数
ISpeakChinese = interface(IInterface)
function SayHello: string;
end; // IInterface表示申明了一些函数,自己本身没有实现部分,需要由继承它的类来实现函数
ISpeakEnglish = interface(IInterface)
function SayHello: string;
end; // 人类
TMan = class(TInterfacedObject)
private
// 姓名
FName: string;
public
property Name: string read FName write FName;
end; // 中国人,继承了人类和说汉语
TChinese = class(TMan, ISpeakChinese)
private
// ISpeakChinese中定义的函数,序号在继承类中实现
function SayHello: string;
end; TAmerican = class(TMan, ISpeakEnglish)
private
// ISpeakChinese中定义的函数,序号在继承类中实现
function SayHello: string;
end; // 美籍华人 ,继承了人类,汉语和英语
TAmericanChinese = class(TMan, ISpeakChinese, ISpeakEnglish)
public
constructor create;
// ISpeakChinese中定义的函数,序号在继承类中实现
function SayHello: string;
end; implementation {
********************************** TAmerican ***********************************
}
function TAmerican.SayHello: string;
begin
result := 'Hello!';
end; {
*********************************** TChinese ***********************************
}
function TChinese.SayHello: string;
begin
result := '你好!';
end; {
******************************* TAmericanChinese *******************************
}
constructor TAmericanChinese.create;
begin
name := 'Tom Wang';
end; function TAmericanChinese.SayHello: string;
var
Dad: ISpeakChinese;
Mum: ISpeakEnglish;
begin
Dad := TChinese.create;
Mum := TAmerican.create;
// 调用说中文和说英文方法
result := Dad.SayHello + Mum.SayHello;
end; end.

界面代码如下

unit frmMain;

interface

uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls,
ExtCtrls; type
TForm1 = class(TForm)
Button1: TButton;
LabeledEdit1: TLabeledEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation uses
uSayHello; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);
var
Tom: TAmericanChinese;
begin
// 创建美籍华人类
Tom := TAmericanChinese.Create;
try
LabeledEdit1.text := Tom.Name;
// 输出
ShowMessage(Tom.sayhello);
finally
Tom.Free;
end;
end; end.

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

  1. Delphi的基于接口(IInterface)的多播监听器模式(观察者模式 )

    本文来自:http://www.cnblogs.com/hezihang/p/6083555.html Delphi采用接口方式设计模块,可以降低模块之间的耦合,便于扩展和维护.本文提供一个实现基于接 ...

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

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

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

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

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

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

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

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

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

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

  7. 基于Delphi的接口编程入门

    为什么使用接口? 举个例子好了:有这样一个卖票服务,电影院可以卖票,歌剧院可以卖票,客运站也可以卖票,那么我们是否需要把电影院..歌剧院和客运站都设计成一个类架构以提供卖票服务?要知道,连经理人都可以 ...

  8. Delphi采用接口实现DLL调用

    Delphi使用模块化开发,可以采用DLL或者BPL,两者的区别是BPL只能被同版本的Delphi使用,DLL可以被不同版本和不同开发工具的开发的软件调用. 因此我们的软件大多使用Delphi作为界面 ...

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

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

随机推荐

  1. 【代码总结】PHP文件的上传和下载

    ===================== 文件上传和下载 ===================== 一.php.ini的配置信息 file_uploads = On /Off    是否允许文件上 ...

  2. selenium webdriver 模拟鼠标悬浮

    /**模拟鼠标悬浮在某元素上 * @param driver * @param locator */ public static void moveToElement(WebDriver driver ...

  3. PAT T1009 Triple Inversions

    树状数组判断三元逆序对~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; ]; long long l[maxn], ...

  4. 01初步启动Hadoop服务

    1.rz命令将hadoop压缩包上传至Linux服务器中 2.tar -zxvf hadoop-2.7.7.tar.gz(解压即可用) 3.将解压出来的hadoop移到想要放的位置 mv hadoop ...

  5. 孤荷凌寒自学python第103天认识区块链017

    [主要内容] 今天继续分析从github上获取的开源代码怎么实现简单区块链的入门知识,共用时间25分钟. (此外整理作笔记花费了约34分钟) 详细学习过程见文末学习过程屏幕录像. 今天所作的工作是进一 ...

  6. 学习笔记(10)- 智能会话框架rasa

    https://rasa.com/ 阿里用过这个,贝壳也在用这个. 优点: 有中文版本(https://github.com/crownpku/rasa_nlu_chi): 2018年发布,文档多,业 ...

  7. freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...]

    FreeMarker template error:The following has evaluated to null or missing:==> product  [in templat ...

  8. 解决IE打开时,弹出的提示调用active的问题,阻止js运行。

    在html和head中间加上: <!-- saved from url=(0014)about:internet -->

  9. Firefox 的 hack 及 问题

    hack: @-moz-document url-prefix(){ #selector{ display: flex; justify-content: space-between; } } 问题一 ...

  10. springboot,vue,shiro整合 关于登录认证功能

    首先是session问题 传统session认证 http协议是一种无状态协议,即浏览器发送请求到服务器,服务器是不知道这个请求是哪个用户发来的.为了让服务器知道请求是哪个用户发来的,需要让用户提供用 ...