delphi中接口的委托和聚合

2009-09-27 10:44:44|  分类: 默认分类 |  标签: |举报 |字号大中小 订阅

 
 

委托:
当存在两个接口,和两个类;这两个类分别实现了两个接口;
现在需要一个创建一个类支持这两个接口,为了不采用重复的工作
就可以在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中接口的委托和聚合的更多相关文章

  1. Delphi中的接口和抽象类

    参考:http://blog.csdn.net/xinzheng_wang/article/details/6058643 接口:Interface Delphi中接口中的关键字Interface,但 ...

  2. Delphi中ARC内存管理的方向

    随着即将发布的10.3版本,RAD Studio R&D和PM团队正在制作Delphi在内存管理方面的新方向. 几年前,当Embarcadero开始为Windows以外的平台构建新的Delph ...

  3. Delphi 的接口机制——接口操作的编译器实现过程(2)

    接口对象的内存空间 假设我们定义了如下两个接口 IIntfA 和 IIntfB,其中 ProcA 和 ProcB 将实现为静态方法,而 VirtA 和 VirtB 将以虚方法实现: IIntfA =  ...

  4. 在Delphi中使用C++对象(两种方法,但都要改造C++提供的DLL)

    Delphi是市场上最好的RAD工具,但是现在C++占据着主导地位,有时针对一个问题很难找到Delphi或Pascal的解决方案.可是却可能找到了一个相关的C++类.本文描述几种在Delphi代码中使 ...

  5. 在Delphi中使用C++对象(转)

    源:http://blog.csdn.net/henreash/article/details/7352335 Delphi是市场上最好的RAD工具,但是现在C++占据着主导地位,有时针对一个问题很难 ...

  6. 基于Delphi的接口编程入门

    为什么使用接口? 举个例子好了:有这样一个卖票服务,电影院可以卖票,歌剧院可以卖票,客运站也可以卖票,那么我们是否需要把电影院..歌剧院和客运站都设计成一个类架构以提供卖票服务?要知道,连经理人都可以 ...

  7. Delphi中使用比较少的一些语法

    本文是为了加强记忆而写,这里写的大多数内容都是在编程的日常工作中使用频率不高的东西,但是又十分重要. ---Murphy 1,构造和析构函数: a,构造函数: 一般基于TComponent组件的派生类 ...

  8. delphi中midas是什么

    Delphi中MIDAS到底是什么呢?和他相关组件是什么呢?   MIDAS(Multitiered Distributed Application Services)多层分布式应用服务.   Del ...

  9. Delphi中的异常处理

    转载:http://www.cnblogs.com/doit8791/archive/2012/05/08/2489471.html 以前写Delphi程序一直不注意异常处理,对其异常处理的机制总是一 ...

随机推荐

  1. 大道至简、大智若愚—GO语言最佳详解实践

      导读:2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语言来取代C++, 这就是Gol ...

  2. vue scoped 穿透_vue 修改内部组件样式问题

    何为scoped? 在vue文件中的style标签上,有一个特殊的属性:scoped.当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,也就是说,该样式只能适用于当前组 ...

  3. django----查看数据库中的sql语句

    加载setting.py 文件中 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console ...

  4. Python3-RabbitMQ 3.7.2学习——Hello World(二)

    RabbitMQ环境搭建好了,接下来就是学习编程的入门级hello world. 在运行程序前,要先确保开启RabbitMQ服务 然后安装pika,命令:pip install pika 1.创建一个 ...

  5. MVC开发中的常见错误-07-“System.IO.DirectoryNotFoundException”类型的未经处理的异常在 mscorlib.dll 中发生

    “System.IO.DirectoryNotFoundException”类型的未经处理的异常在 mscorlib.dll 中发生 其他信息: 未能找到路径“F:\Users\home\Docume ...

  6. this和引用变量的地址值是同一个---------new后面的是构造方法

    /*全局变量和构造方法及this和引用变量的关系 引用变量在栈里面对象在堆中this你可以理解为在堆里面this就是这个对象自己  */ public class Person {/* * 定义属性 ...

  7. canvas简单下雨特效

    前面做了两个简单的效果,这次就来个下雨的效果 思路简单的说一下 随机在屏幕中的位置画雨滴,moveTo(x,y) 雨滴的长度就是lineTo(x,y+len) 每次重新绘制页面,就能达到下雨的效果了 ...

  8. 6-4 破碎的键盘 uva11988

    基础的数组链表 用cur标记光标之前的  用last标记最后的十分巧妙 数组开的不够大会引起RE!! next[0]=0:这使得最后一项所指的为0 核心语句: next[i]=next[cur] ne ...

  9. 浅谈html5 video 移动端填坑记

    这篇文章主要介绍了浅谈html5 video 移动端填坑记,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 本文介绍了html5 video 移动端填坑记,分享给大家,具体 ...

  10. 获取运行端口监听的用户身份auth-owner

    获取运行端口监听的用户身份auth-owner   Windows系统提供工作在TCP 113端口的授权服务(Authentication Service),用来判断TCP连接的用户.Nmap的aut ...