我想写一套组件,类似MSXML的XML解析包功能。MSXML解析包中有很多接口,它内部肯定有很多内部使用的方法需要定义使用,不暴露给外部调用者。
    如果我把所有的方法(包括想要定义成私有的)都定义在接口中,势必被调用者看到。我又想使用接口方式的生命周期管理。不知如何才能将私有方法和public方法分开。不知道是否可以定义另外的接口,只声明私有方法,供内部调用,这个另外定义的接口不作为COM对象的接口对外公开。
    不知道是否可以。好像所有的接口都定义在一个_TLB.pas文件中的。
    希望有这方面经验的人,能够指点一二,非常感谢!

解决方案 »

  1.   

    IPrivate = interface(IUnknown)IPublic = interface(IDispatch)TComObj = class(TClass, IPubilc, IPrivate);
      

  2.   

    To cgh_chen (愚懒者):
        你对接口和其实现类的关系理解上有问题,所以你会问出这样的问题。
        简单的说IA中假设有A1、A2两个方法,不代表其实现类TA中只能有A1和A2方法的实现,而可以包含A3、A4等等。为了便于你理解,注意以下的伪码示例:
        var myA : IA;
        myA := TA.Create;
        myA.A1;//正确
        myA.A2;//正确
        myA.A3;//错误,因为接口定义中没有A3,虽然其出现在TA中
        myA.A4;//错误,因为接口定义中没有A3,虽然其出现在TA中
        myA := nil;
        我认为,接口之所以为接口就是用来公布的,接口里的方法是不能定义为私有的。所以请不要想定义什么用来“为其它接口服务的”含有私有方法的接口,用上面的方法就能解决你说的问题。
      

  3.   

    creativepeter(头皮屑) 
    我想实现的是不通过对象去调用方法,这样会搞乱变量生命周期的管理方法(接口生命周期管理和对象生命周期管理)。想所有的方法调用都通过接口实现。
    也许我的问题很愚蠢 :)
      

  4.   

    To cgh_chen (愚懒者):
        不知道你是怎么看待接口和对象之间的关系的。接口是协议,是形式,是骨架,仅此而已,对象(你所指的对象,其实是类,或称为实现类)是行为,是内容,是血肉。我不明白“我想实现的是不通过对象去调用方法”这句话的真实含义,抑或你的说法本身就有问题。你可以声明一个接口类型的变量,比如:
        var myInterSample : ImyInterSample;
    当你定义的时候,你必须用某个实现类创建对象赋值给它,比如:
        myInterSample := TmyInterSample.Create;
    所以,你尽可以将可以暴露的方法声明在接口中,而不需要暴露的方法声明和实现在实现类中,这样就达到了你最初预想的结果。
        不知道我是说清楚了你的问题,抑或我们说的压根儿就是南辕北辙,期待继续讨论。
      

  5.   

    你还是没有明白我的想法
    ImyInterSample = interface
    procedure fun1;
    function fun2:boolean;
    end;
    TmyInterSample = class(TAutoObject,ImyInterSample)
    protected
      procedure fun0;
      function fun3:WideString;
    public
      procedure fun1;
      function fun2:boolean;
    end;
    假如还有TmyDOMParser类,实现IDOMParser接口,需要用到TmyInterSample的fun0,fun3.
    在TmyDOMParser中,没有TmyInterSample的类变量,只有myInterSample可以引用。
    你说我该如何实现?你还是没有明白我说的,“对象生命周期管理”和“接口生命周期管理”的差别。
    从对象可以得到接口,但是从接口是得不到对象的,也就无法调用对象的protected和private方法。
    所以我才会说上面的话,提出,两个接口的想法。