COM组件中如何定义接口的私有方法?(问题可能不是很清楚,看具体内容)

苏丹-陈 2005-08-13 11:25:50
我想写一套组件,类似MSXML的XML解析包功能。MSXML解析包中有很多接口,它内部肯定有很多内部使用的方法需要定义使用,不暴露给外部调用者。
如果我把所有的方法(包括想要定义成私有的)都定义在接口中,势必被调用者看到。我又想使用接口方式的生命周期管理。不知如何才能将私有方法和public方法分开。不知道是否可以定义另外的接口,只声明私有方法,供内部调用,这个另外定义的接口不作为COM对象的接口对外公开。
不知道是否可以。好像所有的接口都定义在一个_TLB.pas文件中的。


希望有这方面经验的人,能够指点一二,非常感谢!
...全文
349 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fontain 2005-08-31
  • 打赏
  • 举报
回复
接口仍然是暴露方法和属性的地方,如果你想这样做,可以实现两个接口,或者把类拆开啊
ntn115 2005-08-30
  • 打赏
  • 举报
回复
关注~~
苏丹-陈 2005-08-30
  • 打赏
  • 举报
回复
你还是没有明白我的想法
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方法。
所以我才会说上面的话,提出,两个接口的想法。
creativepeter 2005-08-16
  • 打赏
  • 举报
回复
To cgh_chen (愚懒者):
不知道你是怎么看待接口和对象之间的关系的。接口是协议,是形式,是骨架,仅此而已,对象(你所指的对象,其实是类,或称为实现类)是行为,是内容,是血肉。我不明白“我想实现的是不通过对象去调用方法”这句话的真实含义,抑或你的说法本身就有问题。你可以声明一个接口类型的变量,比如:
var myInterSample : ImyInterSample;
当你定义的时候,你必须用某个实现类创建对象赋值给它,比如:
myInterSample := TmyInterSample.Create;
所以,你尽可以将可以暴露的方法声明在接口中,而不需要暴露的方法声明和实现在实现类中,这样就达到了你最初预想的结果。
不知道我是说清楚了你的问题,抑或我们说的压根儿就是南辕北辙,期待继续讨论。
苏丹-陈 2005-08-16
  • 打赏
  • 举报
回复
creativepeter(头皮屑)
我想实现的是不通过对象去调用方法,这样会搞乱变量生命周期的管理方法(接口生命周期管理和对象生命周期管理)。想所有的方法调用都通过接口实现。
也许我的问题很愚蠢 :)
creativepeter 2005-08-15
  • 打赏
  • 举报
回复
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;
我认为,接口之所以为接口就是用来公布的,接口里的方法是不能定义为私有的。所以请不要想定义什么用来“为其它接口服务的”含有私有方法的接口,用上面的方法就能解决你说的问题。
苏丹-陈 2005-08-14
  • 打赏
  • 举报
回复
我的问题是,不是暴露不暴露接口,而是暴露不暴露方法。所以想到定义两个接口的方法。
LocustWei 2005-08-13
  • 打赏
  • 举报
回复
IPrivate = interface(IUnknown)

IPublic = interface(IDispatch)

TComObj = class(TClass, IPubilc, IPrivate);
doway 2005-08-13
  • 打赏
  • 举报
回复
想公开一个接口其实并不容易。并不是说你的类实现了什么接口,这些接口就都会暴露出来,要暴露接口需要在类厂中明确定义,那是需要添加代码才能暴露出来地。

你想得太远了,你得开始做才会清楚。

苏丹-陈 2005-08-13
  • 打赏
  • 举报
回复
我是不确定这种定义两个接口的方式是否可用?我现在就试试看

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧