delphi中介面的委託和聚合

Max Woods發表於2014-07-14

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掉,所以在使用物件引用時,必須很好的控制物件引用的計數邏輯。一般通過介面控制類的生存週期。

相關文章