ATL / COM:我可以在同一对象的两个不同接口中具有相同功能吗?

Asked
Viewd126

1

我有一个用VC ++ 6.0编写的基于ATL / COM的DLL。直到最近,我的COM接口和类之间还是一一对应的。例如,假设有一个ICar接口;然后还有一个实现它的CCar类,除了CCar实现ICar之外没有其他类,并且CCar除了ICar之外没有实现任何接口。同样,IPlane和CPlane。定义可能类似于:

ICar具有功能“ StepOnGas”和“ MaxPassengers”; IPlane具有“ LowerLandingGear”和“ MaxPassengers”功能。

最近,我对其进行了更改,以便有一个IVehicle接口,该接口没有相应的CVehicle类,并且由CCar和CPlane都实现。所以:

ICar具有“ StepOnGas”; IPlane具有“ LowerLandingGear”; IVehicle具有“ MaxPassengers”。 CCar实现了ICar和IVehicle; CPlane实现了IPlane和IVehicle。

这很好,但是从DLL客户端的角度来看这有点痛苦;他们有一辆ICar,他们想知道它可以容纳多少乘客。以前,他们可以问这个问题。现在,他们必须跳过将其更改为IVehicle的过程,然后才能提出要求。

所以我想做的更多是这样的:

ICar具有“ StepOnGas”和“ MaxPassengers”; IPlane具有“ LowerLandingGear”和“ MaxPassengers”; IVehicle具有“ MaxPassengers”。 CCar仍然实现ICar和IVehicle,而CPlane仍然实现IPlane和IVehicle。

我希望CCar只能有一个“ MaxPassengers”,并且可以从ICar和IVehicle访问它。同样,CPlane也只有一个“ MaxPassengers”,并且可以从IPlane和IVehicle进行访问。

这会引起任何问题吗?除了在ICar和IPlane的IDL中添加“ MaxPassengers”之外,我是否还需要做其他特定的事情?

万一有问题,可以使用VC ++ 6.0和VB6编写此DLL的客户端。

在此先感谢您的帮助。

1 个答案

2

简单答案:是的,您可以

甚至更好:为什么不从IVehicle继承ICar,也就是可以使用新方法扩展 IVehicle并将其命名为ICar。这样,您的对象可以同时为两个接口进行质量检查,并且ICar将具有客户端操作对象所需的所有方法。这也允许将ICar上载到IVehicle,以便两个接口可以共享一个实现(即,在ICar上访问MaxPassengers,并且IVehicle都执行相同的C ++方法)。

与IPlane相同,但扩展名将包含不同的方法。

  • 哦,那太好了。我不知道您可以在IDL中做到这一点。我将研究弄清楚做到这一点的语法。

    非常感谢!

    Ptah- Opener of the MouthNovember 13, 2009 21:21