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.
03.Delphi通过接口实现多重继承的优化的更多相关文章
- 02.Delphi通过接口实现多重继承
uSayHello类如下: unit uSayHello; interface type // 接口 IGreetable = interface ['{D91DDE09-0FC4-4FE9-AE0D ...
- Delphi 的接口机制——接口操作的编译器实现过程(1)
学习COM编程技术也快有半个月了,这期间看了很多资料和别人的程序源码,也尝试了用delphi.C++.C#编写COM程序,个人感觉Delphi是最好上手的.C++的模版生成的代码太过复杂繁琐,大量使用 ...
- delphi中接口的委托和聚合
Delphi的TRegistry注册表类 方法详解 Delphi的接口编程入门 delphi中接口的委托和聚合 2009-09-27 10:44:44| 分类: 默认分类 | 标签: |举报 |字 ...
- 03: zabbix API接口 对 主机、主机组、模板、应用集、监控项、触发器等增删改查
目录:Django其他篇 01: 安装zabbix server 02:zabbix-agent安装配置 及 web界面管理 03: zabbix API接口 对 主机.主机组.模板.应用集.监控项. ...
- 05.Delphi接口的多重继承深入
由于是IInterface,申明了SayHello,需要由继承类来实现函数,相对于03篇可以再精简一下 unit uSayHello; interface uses SysUtils, Windows ...
- 04.Delphi通过接口IInterface实现多重继承
IInterface表示申明了一些函数,自己本身没有实现部分,需要由继承它的类来实现函数 uSayHello代码如下 unit uSayHello; interface uses SysUtils, ...
- C++解析(24):抽象类和接口、多重继承
0.目录 1.抽象类和接口 1.1 抽象类 1.2 纯虚函数 1.3 接口 2.被遗弃的多重继承 2.1 C++中的多重继承 2.2 多重继承的问题一 2.3 多重继承的问题二 2.4 多重继承的问题 ...
- Delphi面向对象---接口
从Delphi3开始支持接口.接口定义了能够与一个对象进行交互操作的一组过程和函数.对一个接口进行定义包含两个方面的内容: 1)一方面是实现这个接口 2)另一方面是定义接口的客户 一个类能够实现多个接 ...
- java中接口与多重继承的关系
在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...
随机推荐
- Atcoder Grand Contest 037C(贪心,优先队列,思维)
#define HAVE_STRUCT_TIMESPEC//编译器中time.h和phread.h头文件中timespec结构体重名,故加此行#include<bits/stdc++.h> ...
- Linux centosVMware Nginx访问日志、Nginx日志切割、静态文件不记录日志和过期时间
一.Nginx访问日志 vim /usr/local/nginx/conf/nginx.conf //搜索log_format 日至格式 改为davery格式 $remote_addr 客户端IP ...
- LCS(最长公共子序列)
这个问题很有意思,在生物应用中,经常需要比较两个(或多个)不同生物体的DNA片段.例如,某种生物的DNA可能为S1 = ACCGGTCGAGTGCGCGGAAGCCGGCCGAA,S2 = GTCGT ...
- ch3 盒模型、定位
标准盒模型.怪异盒模型 外边距叠加 当两个或者争夺垂直外边距相遇时,他们将形成一个外边距,这个外边距的高度等于两个发生叠加的外边距的高度中的较大者. 当一个元素出现在另一个元素上面时,第一个元素的底外 ...
- 记一次NoHttpResponseException问题排查
上传文件程序会有一定的概率提示错误,错误率大概在1%以下,错误信息是:org.apache.http.NoHttpResponseException , s3-us-west-1.amazonaws. ...
- vmware workstation导入ovf文件报错:未通过OVF规范一致性或虚拟硬件合规性检查
转自:https://blog.csdn.net/zs15yy/article/details/73793585 报错如下: 原因:这是因为OVF 版本不同导致的,VMware Workstation ...
- MyISAM/Innodb的区别
MyISAM是MySQL的默认数据库引擎(5.5版之前).虽然性能极佳,而且提供了大量的特性,包括全文索引.压缩.空间函数等,但MyISAM不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复.不 ...
- 【MAVEN】maven项目下载更新pom jar包速度慢 解决方案
1·下载安装 最新版本的maven https://maven.apache.org/download.cgi 2·速度慢的主要原因是因为默认setting.xml里配置的国外的 maven 数据源 ...
- Kubernetes 二进制部署(二)集群部署(多 Master 节点通过 Nginx 负载均衡)
0. 前言 紧接上一篇,本篇文章我们尝试学习多节点部署 kubernetes 集群 并通过 haproxy+keepalived 实现 Master 节点的负载均衡 1. 实验环境 实验环境主要为 5 ...
- 剑指 offer 树的子结构
题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构). 第一遍没写出来错误点:认为首先应该找到pRoot1等于pRoot2的节点,但是递归就是自己在不 ...