我想写一套组件,类似MSXML的XML解析包功能。MSXML解析包中有很多接口,它内部肯定有很多内部使用的方法需要定义使用,不暴露给外部调用者。
如果我把所有的方法(包括想要定义成私有的)都定义在接口中,势必被调用者看到。我又想使用接口方式的生命周期管理。不知如何才能将私有方法和public方法分开。不知道是否可以定义另外的接口,只声明私有方法,供内部调用,这个另外定义的接口不作为COM对象的接口对外公开。
不知道是否可以。好像所有的接口都定义在一个_TLB.pas文件中的。
希望有这方面经验的人,能够指点一二,非常感谢!
如果我把所有的方法(包括想要定义成私有的)都定义在接口中,势必被调用者看到。我又想使用接口方式的生命周期管理。不知如何才能将私有方法和public方法分开。不知道是否可以定义另外的接口,只声明私有方法,供内部调用,这个另外定义的接口不作为COM对象的接口对外公开。
不知道是否可以。好像所有的接口都定义在一个_TLB.pas文件中的。
希望有这方面经验的人,能够指点一二,非常感谢!
你对接口和其实现类的关系理解上有问题,所以你会问出这样的问题。
简单的说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;
我认为,接口之所以为接口就是用来公布的,接口里的方法是不能定义为私有的。所以请不要想定义什么用来“为其它接口服务的”含有私有方法的接口,用上面的方法就能解决你说的问题。
我想实现的是不通过对象去调用方法,这样会搞乱变量生命周期的管理方法(接口生命周期管理和对象生命周期管理)。想所有的方法调用都通过接口实现。
也许我的问题很愚蠢 :)
不知道你是怎么看待接口和对象之间的关系的。接口是协议,是形式,是骨架,仅此而已,对象(你所指的对象,其实是类,或称为实现类)是行为,是内容,是血肉。我不明白“我想实现的是不通过对象去调用方法”这句话的真实含义,抑或你的说法本身就有问题。你可以声明一个接口类型的变量,比如:
var myInterSample : ImyInterSample;
当你定义的时候,你必须用某个实现类创建对象赋值给它,比如:
myInterSample := TmyInterSample.Create;
所以,你尽可以将可以暴露的方法声明在接口中,而不需要暴露的方法声明和实现在实现类中,这样就达到了你最初预想的结果。
不知道我是说清楚了你的问题,抑或我们说的压根儿就是南辕北辙,期待继续讨论。
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方法。
所以我才会说上面的话,提出,两个接口的想法。