Delphi的接口委托示例
{
说明:该事例实现的效果,在单个应用或代码量小的项目中,可以完全不用接口委托来完成。
之所以采用委托接口,主要是应用到:已经实现的接口模块中,在不改变原有代码的情况下,
需要对其进行扩展;原始模块只需要开放部分功能,但又不能暴露实现细节的场合;
}
unit TestUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const
TestMsgGUID: TGUID = '{4BE80D5E-D94B-42BE-9114-077DC2708451}';
type
//原始接口中新增需要暴露给其它模块的接口定义,公用部分
ITestMsg = interface
['{4BE80D5E-D94B-42BE-9114-077DC2708451}']
procedure ShowTestMsg;
end;
//---------------------------------服务模块
//基类对象,只需要开放ShowTestMsg方法给外部,所以做为按口的实现基类
TBaseTestMsg = class(TInterfacedObject, ITestMsg)
public
//.... 模块已存在的老代码....
//新开放的接口代码方法
procedure ShowTestMsg; virtual; //申明成虚拟方法,以便继承类可以重载
end;
//---------------------------------接口委托对象定义
TTestMsgClass = class(TInterfacedObject, ITestMsg)
private
FTestMsg: ITestMsg;
public
property Service: ITestMsg read FTestMsg implements ITestMsg;
constructor Create(AClass: TClass);
constructor CreateEx(AClass: TClass); //另一种用法, 不采用TBaseTestMsg做为基类创建委托实例
destructor Destroy; override;
end;
//----------------------------------外部引用的业务模块
//完成具体业务的委托实例
TETestMsg = class(TInterfacedObject, ITestMsg)
public
procedure ShowTestMsg;
end;
//完成具体业务的委托实例
TCTestMsg = class(TInterfacedObject, ITestMsg)
public
procedure ShowTestMsg;
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure DoTest(AClass: TClass; ACreateEx: Boolean = False); //测试方法
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TBaseTestMsg }
procedure TBaseTestMsg.ShowTestMsg;
begin
end;
{ TTestMsgClass }
constructor TTestMsgClass.Create(AClass: TClass);
var
vObj: TBaseTestMsg;
begin
vObj := TBaseTestMsg(AClass.NewInstance);
FTestMsg := vObj.Create;
end;
constructor TTestMsgClass.CreateEx(AClass: TClass);
begin
//该方法不采用TBaseTestMsg做为基类创建委托实例,更通用更灵活
(AClass.NewInstance.Create).GetInterface(TestMsgGUID, FTestMsg);
end;
destructor TTestMsgClass.Destroy;
begin
FTestMsg := nil;
inherited;
end;
{ TETestMsg }
procedure TETestMsg.ShowTestMsg;
begin
ShowMessage('TETestMsg Msg:' + 'OK');
end;
{ TCTestMsg }
procedure TCTestMsg.ShowTestMsg;
begin
ShowMessage('TCTestMsg 消息:' + '好的');
end;
//--------------------以下为测试代码--------------------------------
procedure TForm1.DoTest(AClass: TClass; ACreateEx: Boolean);
var
vClass: TTestMsgClass;
vTest: ITestMsg;
begin
if ACreateEx then
vClass := TTestMsgClass.CreateEx(AClass)
else
vClass := TTestMsgClass.Create(AClass);
try
vTest := vClass;
vTest.ShowTestMsg;
finally
vTest := nil;
FreeAndNil(vClass);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
DoTest(TETestMsg);
DoTest(TCTestMsg);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DoTest(TETestMsg, True);
DoTest(TCTestMsg, True);
end;
end.
Delphi的接口委托示例的更多相关文章
- delphi中接口的委托和聚合
Delphi的TRegistry注册表类 方法详解 Delphi的接口编程入门 delphi中接口的委托和聚合 2009-09-27 10:44:44| 分类: 默认分类 | 标签: |举报 |字 ...
- 基于Delphi的接口编程入门
为什么使用接口? 举个例子好了:有这样一个卖票服务,电影院可以卖票,歌剧院可以卖票,客运站也可以卖票,那么我们是否需要把电影院..歌剧院和客运站都设计成一个类架构以提供卖票服务?要知道,连经理人都可以 ...
- Delphi采用接口实现DLL调用
Delphi使用模块化开发,可以采用DLL或者BPL,两者的区别是BPL只能被同版本的Delphi使用,DLL可以被不同版本和不同开发工具的开发的软件调用. 因此我们的软件大多使用Delphi作为界面 ...
- Delphi之通过代码示例学习XML解析、StringReplace的用法(异常控制 good)
*Delphi之通过代码示例学习XML解析.StringReplace的用法 这个程序可以用于解析任何合法的XML字符串. 首先是看一下程序的运行效果: 以解析这样一个XML的字符串为例: <? ...
- Delphi 的接口机制——接口操作的编译器实现过程(1)
学习COM编程技术也快有半个月了,这期间看了很多资料和别人的程序源码,也尝试了用delphi.C++.C#编写COM程序,个人感觉Delphi是最好上手的.C++的模版生成的代码太过复杂繁琐,大量使用 ...
- 国际快递查询接口JAVA示例-trackingmore
国际快递查询接口 国际快递查询接口的需求量很大,例如一些跨境电商B2C网站.快递查询APP.快递柜.跨境物流公司等都会需要用到国际快递接口. 目前市面上的快递接口,以国内快递居多,有些虽然号称支持多家 ...
- Delphi面向对象---接口
从Delphi3开始支持接口.接口定义了能够与一个对象进行交互操作的一组过程和函数.对一个接口进行定义包含两个方面的内容: 1)一方面是实现这个接口 2)另一方面是定义接口的客户 一个类能够实现多个接 ...
- Delphi 的接口机制——接口操作的编译器实现过程(2)
接口对象的内存空间 假设我们定义了如下两个接口 IIntfA 和 IIntfB,其中 ProcA 和 ProcB 将实现为静态方法,而 VirtA 和 VirtB 将以虚方法实现: IIntfA = ...
- Delphi中的“委托”
.NET中有委托(Delegate)的概念,其声明形式如下所示: public delegate void MyDelegate(int aIntParam, string aStringPa ...
随机推荐
- Day5-----------------vi编辑器
1.操作模式 1).命令行模式 2).编辑模式 3).扩展模式 2.命令行模式 1).删除与复制 dd 删除光标所在行 ndd 删除光标向下n行 yy 复制光标所在行 nyy 复制光标乡下n行 2). ...
- python安装虚拟环境pipenv
python里如果多个多个项目同时引用包,就会涉及到包版本的问题,包不同版本管理的问题可以用虚拟环境来管理, 创建虚拟环境,这里是用官方推荐的pipenv来创建 先用pip命令行安装pipenv pi ...
- STM32应用实例八:与多台MS5803压力传感器I2C通讯
MS5803压力传感器支持SPI和I2C总线通讯,拥有24位AD转换.能够同时获得压力值和温度值,其中压力测量范围为10-1100mbar,温度的测量范围是-40-85摄氏度.各引脚功能及参数如下: ...
- NodeJs>------->>第一章:Node.js介绍
一:章节前言 二:Node.js概述 1:使用node.js能够解决什么问题 2:实现高性能服务器 3:非阻塞型I/O及事件环形机制 4:node.js适合开发的程序 三:node.js安装 一.No ...
- vue-router之路由钩子(组件内路由钩子必须在路由组件调用,子组件没用)
模式 vue-router中的模式选项主要在router实例化的时候进行定义的,如下 const router = new VueRouter({ mode: 'history', // 两种类型hi ...
- java多线程快速入门(十)
synchonizd解决安全性问题 package com.cppdy; class MyThread6 implements Runnable{ private Integer ticketCoun ...
- poj3264 倍增法(ST表)裸题
打出st表的步骤:1:建立初始状态,2:区间按2的幂从小到大求出值 3:查询时按块查找即可 #include<iostream> #include<cstring> #incl ...
- ***PHP基于H5的微信支付开发详解(CI框架)
这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...
- hdu 3405 删掉某点后 求最小生成树
给出N个点的坐标 边的权值为两点间的距离 删掉其中某点 求最小生成树的权值和 要求这权值最小 因为最多50个点 所以具体是删哪个点 用枚举假如有4个点 就要求4次最小生成树 分别是2 3 4 | 1 ...
- hdu 1242 找到朋友最短的时间 (BFS+优先队列)
找到朋友的最短时间 Sample Input7 8#.#####. //#不能走 a起点 x守卫 r朋友#.a#..r. //r可能不止一个#..#x.....#..#.##...##...#.... ...