delphi中接口的委托和聚合
委托:
当存在两个接口,和两个类;这两个类分别实现了两个接口;
现在需要一个创建一个类支持这两个接口,为了不采用重复的工作
就可以在Create方法中,创建实现了这两个接口的类,然后委托这两个实现了接口的方法去实现功能
代码如下:
type
ISomeIntf
= interface
['{E3285C36-B73B-4F36-8AA1-904F76FBC9E8}']
procedure
Msg;
end;
IOtherIntf = interface
['{271DC3C3-E29E-4D2A-A05D-C3DAC641D723}']
function Check: Boolean;
end;
TSome ISomeIntf)
protected
procedure Msg;
end;
TOther IOtherIntf)
protected
function Check: Boolean;
end;
TIntf IUnknown, ISomeIntf, IOtherIntf)
private
// declare objects
to delegate to
FSomeClass: ISomeIntf;
FOtherClass:
IOtherIntf;
protected
// ISomeIntf
procedure Msg;
//
IOtherIntf
function Check: Boolean;
public
constructor
Create;
end;
{ TIntfClass }
constructor TIntfClass.Create;
begin
inherited;
// create objects
for delegation
FSomeClass:= TSomeClass.Create;
FOtherClass:=
TOtherClass.Create;
end;
function TIntfClass.Check: Boolean;
begin
// delegate work
Result:=
FOtherClass.Check;
end;
procedure TIntfClass.Msg;
begin
// delegate
work
FSomeClass.Msg;
end;
聚合
关键字implements使得一个类通过对象或者接口属性引用(已经实现了接口的类引用)来实现这个类所支持的接口,不用为起支持的接口编写代码。
示例代码如下:
type
ISomeIntf
= interface
['{E3285C36-B73B-4F36-8AA1-904F76FBC9E8}']
procedure
Msg;
end;
IOtherIntf = interface
['{271DC3C3-E29E-4D2A-A05D-C3DAC641D723}']
function Check: Boolean;
end;
TSome ISomeIntf)
protected
procedure Msg;
end;
TOther IOtherIntf)
protected
function Check: Boolean;
end;
TIntf IUnknown, ISomeIntf, IOtherIntf)
private
FSomeClass:
ISomeIntf;
FOtherClass: TOtherClass;
protected
// interface
type reference property
property SomeIntf: ISomeIntf read FSomeClass
implements IUnknown, ISomeIntf;
// object type reference property
property OtherIntf: TOtherClass read FOtherClass implements
IOtherIntf;
end;
但是必须在适当的时候对引用的类初始化;
constructor
TIntfClass.Create;
begin
FSomeClass:= TSomeClass.Create;
FOtherClass:=
TOtherClass.Create;
end;
聚合实际上是委托在代码上的一种简化;对于接口引用和对象引用,区别在于:接口引用比较安全,在它Relrease之前可以安全的引用,但对象引用可能被意外的
Free掉,所以在使用对象引用时,必须很好的控制对象引用的计数逻辑。一般通过接口控制类的生存周期。
delphi中接口的委托和聚合的更多相关文章
- Delphi中的接口和抽象类
参考:http://blog.csdn.net/xinzheng_wang/article/details/6058643 接口:Interface Delphi中接口中的关键字Interface,但 ...
- Delphi中ARC内存管理的方向
随着即将发布的10.3版本,RAD Studio R&D和PM团队正在制作Delphi在内存管理方面的新方向. 几年前,当Embarcadero开始为Windows以外的平台构建新的Delph ...
- Delphi 的接口机制——接口操作的编译器实现过程(2)
接口对象的内存空间 假设我们定义了如下两个接口 IIntfA 和 IIntfB,其中 ProcA 和 ProcB 将实现为静态方法,而 VirtA 和 VirtB 将以虚方法实现: IIntfA = ...
- 在Delphi中使用C++对象(两种方法,但都要改造C++提供的DLL)
Delphi是市场上最好的RAD工具,但是现在C++占据着主导地位,有时针对一个问题很难找到Delphi或Pascal的解决方案.可是却可能找到了一个相关的C++类.本文描述几种在Delphi代码中使 ...
- 在Delphi中使用C++对象(转)
源:http://blog.csdn.net/henreash/article/details/7352335 Delphi是市场上最好的RAD工具,但是现在C++占据着主导地位,有时针对一个问题很难 ...
- 基于Delphi的接口编程入门
为什么使用接口? 举个例子好了:有这样一个卖票服务,电影院可以卖票,歌剧院可以卖票,客运站也可以卖票,那么我们是否需要把电影院..歌剧院和客运站都设计成一个类架构以提供卖票服务?要知道,连经理人都可以 ...
- Delphi中使用比较少的一些语法
本文是为了加强记忆而写,这里写的大多数内容都是在编程的日常工作中使用频率不高的东西,但是又十分重要. ---Murphy 1,构造和析构函数: a,构造函数: 一般基于TComponent组件的派生类 ...
- delphi中midas是什么
Delphi中MIDAS到底是什么呢?和他相关组件是什么呢? MIDAS(Multitiered Distributed Application Services)多层分布式应用服务. Del ...
- Delphi中的异常处理
转载:http://www.cnblogs.com/doit8791/archive/2012/05/08/2489471.html 以前写Delphi程序一直不注意异常处理,对其异常处理的机制总是一 ...
随机推荐
- js的闭包的一个示例说明
js中 某个函数的内部函数在该函数执行结束后仍然可以访问这个函数中定义的变量,这称为闭包(Closure) 复制代码 代码如下: function outside() { var myVar = 1; ...
- mac安装navicat mysql破解版
下载破解中文版http://m6.pc6.com/xuh6/navicat12027pre.zip 完成下载后无法正常进行安装,此时应该打开命令行执行 sudo spctl --master-disa ...
- C++ code:数组初始化
具有初始化的数组定义,其元素个数可以省略,即方括号中的表达式可以省略.这时候,最后确定的元素个数取决于初始化值的个数.例如: #include<iostream> using namesp ...
- 步步为营-64-进程&线程
1 进程 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; us ...
- 【C++ Primer | 10】STL算法
第一部分 find(beg, end, val) equal(beg1, end, beg2) min(val1, val2) max(val1, val2) min_element(beg, end ...
- 基于jsp+servlet图书管理系统之后台用户信息插入操作
前奏: 刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长一段时间没有分享自己的知识.于是静下心来钻研 ...
- Mysql 双主架构配置从复制
引用自:https://blog.csdn.net/deeplearnings/article/details/78398526 https://www.cnblogs.com/ygqygq2/p/6 ...
- Python 可命名元祖
import collections MytupleClass = collections.namedtuple('MytupleClass',['x','y','z']) obj = Mytuple ...
- 微信小程序开发--第一个项目
一:Hello World 1.AppId 2.打开开发者工具 3.显示效果 二:
- Java Web报错: GET http://localhost:8080/ 404 (Not Found)
eclipse正常启动tomcat,但是 访问http://localhost:8080 报404错误 搞笑的是我访问服务器中的其他网页也可以打开 报错如下: 解决: 如果这3项都已经变灰色,删除配置 ...