unit Unit1;
{-----------------------------------------------------------------------------
-----------------------------------------------------------------------------}
interface
uses
type
IMyTask = Interface
var
implementation
{$R *.dfm}
{ TMyClass }
function TMyClass.SayHello: string;
begin
end;
{ TMyPlan }
constructor TMyPlan.Create;
begin
end;
procedure TForm1.Button1Click(Sender: TObject);
var
begin
end;
end.
delphi中接口的委托和聚合
转http://blog.163.com/liang_liu99/blog/static/884152162009827104444775/
委托:
当存在两个接口,和两个类;这两个类分别实现了两个接口;
现在需要一个创建一个类支持这两个接口,为了不采用重复的工作
就可以在Create方法中,创建实现了这两个接口的类,然后委托这两个实现了接口的方法去实现功能
代码如下:
type
ISomeIntf = interface
['{E3285C36-B73B-4F36-8AA1-904F76FBC9E8}']
end;
IOtherIntf = interface
['{271DC3C3-E29E-4D2A-A05D-C3DAC641D723}']
end;
TSome( ISomeIntf)
protected
end;
TOther (IOtherIntf)
protected
end;
TIntf (IUnknown, ISomeIntf, IOtherIntf)
private
protected
public
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}']
end;
IOtherIntf = interface
['{271DC3C3-E29E-4D2A-A05D-C3DAC641D723}']
end;
TSome ISomeIntf)
protected
end;
TOther IOtherIntf)
protected
end;
TIntf IUnknown, ISomeIntf, IOtherIntf)
private
protected
end;
但是必须在适当的时候对引用的类初始化;
constructor TIntfClass.Create;
begin
FSomeClass:= TSomeClass.Create;
FOtherClass:= TOtherClass.Create;
end;
聚合实际上是委托在代码上的一种简化;对于接口引用和对象引用,区别在于:接口引用比较安全,在它Relrease之前可以安全的引用,但对象引用可能被意外的
Free掉,所以在使用对象引用时,必须很好的控制对象引用的计数逻辑。一般通过接口控制类的生存周期。
Delphi的接口委托示例
http://www.cnblogs.com/MurphyAefe/articles/1741825.html
{
}
unit TestUnit;
interface
uses
const
type
var
implementation
{$R *.dfm}
{ TBaseTestMsg }
procedure TBaseTestMsg.ShowTestMsg;
begin
end;
{ TTestMsgClass }
constructor TTestMsgClass.Create(AClass: TClass);
var
begin
end;
constructor TTestMsgClass.CreateEx(AClass: TClass);
begin
end;
destructor TTestMsgClass.Destroy;
begin
end;
{ TETestMsg }
procedure TETestMsg.ShowTestMsg;
begin
end;
{ TCTestMsg }
procedure TCTestMsg.ShowTestMsg;
begin
end;
//--------------------以下为测试代码--------------------------------
procedure TForm1.DoTest(AClass: TClass; ACreateEx:
Boolean);
var
begin
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
end;
end.