delphi中接口的委托和聚合

Delphi的TRegistry注册表类 方法详解

Delphi的接口编程入门

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