kenlistian

勤学多思

  IT博客 :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  138 随笔 :: 0 文章 :: 23 评论 :: 0 Trackbacks

 声明接口
        IMyInterface = interface(IInterface)  
         ['{63E072DF-B81E-4734-B3CB-3C23C7FDA8EA}']  
              function GetName(const str: String): String; stdcall;
              function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; 
              function _AddRef: Integer; stdcall;  //使接口引用数加1。
              function _Release: Integer; stdcall;  //使接口引用数减1,当小于等于0时作释放动作。
        end;
            
说明:如果有继续关系则在括号里填父接口,否则省却,如:IMyInterface = interface这样就行。
说明:GUID可选,如要实现具有COM特性的接口则需要加上
             zc:接口GUID,最好加上,最好分离功能及其封装。

接口中所有的数据成员都是public访问限制,数据成员指定其为不能私有或其他的域成员。
接口中的方法只能有声明,看上去像没有构造和析构方法的纯虚类。


type
  IInterface = interface
    ['']
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
end; 

  该接口实现了QueryInterface,_AddRef,_Release,凡是继承于该接口,则不需要声明
该三个虚函数。
  在实现新接口的类中,也要从TInterfacedObject 后继承,原因在于该类实现以上函数的
实现部分,不要考虑QueryInterface等完成。如下:
type
  TNewInterfaceClass = class(TInterfacedObject, INewInterface)
   ...
end;



 
接口的实现
         接口服务是由类来实现的。
                TIntfClass = class(TObject, IMyInterface)
                private
                    FCounter: Integer;
                    FRefCount: Integer;
                public
                    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
                    ...
                end;
 
获取接口
    a. 使用类型转换。 
        如:var aIntf: IMyInterface;
               begin
                       aObj := TIntfClass.Create;
                        try
                            aIntf := (IMyInterface(aObj);
                                ...
    b. 利用Delphi编译器内建机制。 如:aIntf := aObj。
    c. 利用对象的QueryInterface方法。
           如
                 OleCheck(aObj.QueryInterface(IID, aIntf)); 只能存取有GUID的COM接口。
   d. 利用as操作符。
         使用as操作符必须符合下面条件:
    1.接口要从IInterface接口继承下来。
    2.有GUID值
      在Delphi7中接口的实现类还必须是从TInterfacedObject继承下来才行,
      如  TIntfClass = class(TInterfacedObject, IMyInterface)
       zc: 最好用该方法,考虑使用接口有其他语言开发l情况下的使用。
 
接口和对象生命期             
  对接口直接=nil即可,freeAndNil则不需要。因接口特性,会计数减少1
 
 
接口的委托(Interface Delegation)
 分为两种:
1. 对象接口委托   
2. 类对象委托。
(略)
posted on 2009-01-04 16:16 kenlistian 阅读(1401) 评论(0)  编辑 收藏 引用 所属分类: Base
只有注册用户登录后才能发表评论。