在上一篇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通过接口实现多重继承的优化的更多相关文章

  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. Vue学习笔记:计算属性

    使用函数的缺点 如果我们想要将数据经过转化后再显示,或者多个数据结合起来进行显示,一般可以直接在数据渲染或者数据绑定的时候书写表达式 如果表达式过于复杂,或者逻辑太多的时候,我们可以将其封装在函数里, ...

  2. Java--对象与类(二)

    final 实例域 可以将实例域定义为final.构建对象时必须初始化这样的域.也就是说在一个构造器执行之后,这个域被设置,并且之后无法对其修改 final 修饰符大多应用于基本(primitive) ...

  3. Java--输入与输入

    输入 java.util.Scanner java.lang.System java.io.Console ``` Scanner in = new Scanner(System.in); // 新建 ...

  4. Codeforces Round #594 (Div. 2) - C. Ivan the Fool and the Probability Theory(思维)

    题意:给n*m的网格涂黑白两种颜色,保证每个格子上下左右的四个格子中最多只有一个格子与自己颜色相同,问有多少种涂法?结果$mod1000000007$ 思路:先只考虑一行有多少种涂法 $dp[i][0 ...

  5. 分支预测(branch prediction)

    记录一个在StackOverflow上看到一个十分有趣的问题:问题. 高票答案的优化方法: 首先找到罪魁祸首: if (data[c] >= 128) sum += data[c]; 优化方案使 ...

  6. Mysql 锁定 读情况

    在一个事务中,标准的SELECT语句是不会加锁,但是有两种情况例外. SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE SELECT ... LO ...

  7. sql数据库的基本操作

    命令行 1.显示当前数据库服务器中的数据库列表:mysql> SHOW DATABASES;2.建立数据库:mysql> CREATE DATABASE 库名;3.建立数据表:mysql& ...

  8. 「SCOI2005」王室联邦

    「SCOI2005」王室联邦 传送门 树分块. 考虑把树,按照节点个数每 \(B\) 个分块,把块顶作为省会. 这是具体证明 参考代码: #include <cstdio> #define ...

  9. red hat 7、centos7的root密码破译

    一.在开机画面时按"E". 二.找到linux16开头的这段,在段尾添加空格"rd.break"然后按Ctrl+x进入系统紧急救援模式. 三.新的界面出现命令行 ...

  10. 深度解析Java可变参数类型以及与数组的区别

    注意:可变参数类型是在jdk1.5版本的新特性,数组类型是jdk1.0就有了. 这篇文章主要介绍了Java方法的可变参数类型,通过实例对Java中的可变参数类型进行了较为深入的分析,需要的朋友可以参考 ...