• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

delphi中接口的委托和聚合

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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掉,所以在使用对象引用时,必须很好的控制对象引用的计数逻辑。一般通过接口控制类的生存周期。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
MATLAB 自适应中值滤波RAMF发布时间:2022-07-18
下一篇:
matlab数据序列的几种滤波器发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap