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

  • 相关阅读:
    类与类关系的UML图与代码表现
    JAVA加密算法简介
    【转】[C#]二维码生成、解码(QRCode)【支持winform、web调用】
    【转】[C#]二维码生成、解码(QRCode)【支持winform、web调用】
    C# 断网
    subversion prerevpropchange.bat
    How can I get a layer's DataSource properties.
    subversion prerevpropchange.bat
    C# 断网
    使用 Tkprof 分析 ORACLE 跟踪文件3
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/3843615.html
Copyright © 2011-2022 走看看