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程序一直不注意异常处理,对其异常处理的机制总是一 ...
随机推荐
- PC上图标显示异常 白色框框处理方案
步骤如下: 1.打开360安全卫士,点击图标显示异常的立即修复 2.修复完,图标就正常了 3.分析原因: 可能是我用了魔方优化大师(TweakerCube)优化了桌面快捷方式(去掉箭头)引起的,而且是 ...
- 【前端】JS文本比较插件
一.先上效果图 二.JS代码 /** * [文本比较插件] * 传递两个参数dom1.dom2,以dom1为基准进行比较. * 0)dom1和dom2不能都为空: * 1)如果dom1不存在,则dom ...
- java多线程快速入门(二)
通过继承Thread类来实行多线程 package com.cppdy; //通过继承Thread类来实行多线程 class MyThread extends Thread{ @Override pu ...
- OI中坑点总结
以下是我个人OI生涯中遇到的坑点的一个小总结,可能是我太菜了,总是掉坑里,请大佬勿喷 1,多重背包的转移的循环顺序 //默认每个物品体积为一(不想打码……) //dp[i]表示占用背包容量i所能获得的 ...
- jquery的clone方法应用于textarea和select的bug修复不能copy值,clone id重复的解决
textarea和select的值clone的时候会丢掉,在clone的时候将val再重新赋值一下,如果知道这个了就简单了, 测试发现,textarea和select的jquery的clone方法有问 ...
- Redis 5.0 集群搭建
Redis 5.0 集群搭建 单机版的 Redis 搭建 https://www.jianshu.com/p/b68e68bbd725 /usr/local/目录 mkdir redis-cluste ...
- jQuery插件实践之轮播练习(一)
所有文章搬运自我的个人主页:sheilasun.me 因为从来没写过jQuery插件,所以本文要通过一个轮播的例子,练习jQuery插件的写法. 新建插件文件 在讨论细节之前,先新建插件文件(当然也可 ...
- java加密工具类,可设置对应的加解密key
public class AesEncryptUtil { //使用AES-128-CBC加密模式,key需要为16位,key和iv可以相同! private static String KEY =& ...
- 011 Spark应用构成结构
一:端口4040 1.意思 其中4040端口代表的含义是application UI 是应用程序界面. 包含Jobs,Stages,environment,System,SQL等. 二:应用结构 1. ...
- 007 关于Spark下的第二种模式——standalone搭建
一:介绍 1.介绍standalone Standalone模式是Spark自身管理资源的一个模式,类似Yarn Yarn的结构: ResourceManager: 负责集群资源的管理 NodeMan ...