我一直在增加新的功能,一个COM接口,并从我读做(并保持向后兼容)的唯一方法是创建一个新的界面,继承了旧的接口,并添加新的方法。 我曾尝试这样做,但我的层次结构已经相当复杂。
说这是我目前的接口如何:
IBaseInterface
|
IDerivedInterface
我想添加一些功能的基本接口,并且它现在看起来是这样的:
IBaseOldInterface
|
IBaseInterface
|
IDerivedInterface
因为我已经加入这一新功能做我需要创建一个新的IDerivedInterface? 我已经尝试过的方式,它是在目前,它似乎并没有正确的所有情况。
我只是想确认一些真的,并解释为什么如果可能的话
我需要进一步解释什么是我理想的情况是,为什么:
我想添加一些方法给那么所有的派生类可以使用IBaseInterface类。 我想也许有可能是这样的:
IBaseOldInterface
/ \
IDerivedOldInterface IBaseNewInterface
\ /
IDerivedNewInterface
据我所知,菱形继承应避免,但他们只是接口,所以我认为这将是正常的。
具有这种新的结构中,当用户请求INewDerivedInterfaces之一。 查询界面将会为任何IID正确的接口,无论是INewDerivedInterface或IOldDerivedInterface。
添加方法的基本接口(或由另一扩展它取代它)改变了所有派生接口的虚函数表的布局,所以你确实需要创建新的IID新的派生接口。
这是行不通的。 正如你所说,保持兼容性,您不能更改已发布的接口。 但通过改变继承要修改的接口。
所以,你可以添加新的方法,新的子类,然后你就会有这样的结构:
IBaseInterface
|
IDerivedInterface
|
IDerivedInterface2
或者,也许你应该做的是增加一个新的接口,它的实施对象支持。 所以,与其使用继承,你只需声明您的实现类支持多个接口。
在这种情况下,你会抛开现有的继承结构,有这样的事情:
IBaseInterface INewInterface
|
IDerivedInterface
然后实现这样的类:
class TMyObject: public TInterfacedObject, IDerivedInterface, INewInterface
有三种方法可以给你添加新的功能IBaseInterface
, IDerivedInterface
接口:
您添加新方法的底部IDerivedInterface
。 新建应用程序意识到这些新方法将能够使用它们。 此前创建的应用程序将使用旧的方法保持安全。 您不能添加方法IBaseInterface
或从另一个接口reinherit它,因为这会转移依赖的方法。 从你原来的问题的方面,我有,你是改变由一系列的外部软件项目中使用的公共接口的感觉,你不希望你的变化引起的任何问题。 如果是这样,你也许会想从去这条道路,尽管这看起来简单,做的工作,以抑制(见下为什么)。
您可以从派生出新的接口IBaseInterface
或IDerivedInterface
和新建的应用程序将使用它。 需要提防新IID分配给新的接口。
- 您可以定义(如新界面
INewInterface
在@ DavidHeffernan是以上)和你的COM对象仅仅实现了多个接口。 新建的应用程序可以查询新的接口,并调用它的方法。
上述第3项是可能延长对象的典型,容易和方便的方式。 第2项也只如果你需要保持对“主”接口的方法,例如用于旧版客户端,如VB6感。 第1项是一种能够快速添加的东西,而无需修改代码太多,它的工作太 - 唯一的问题是,客户端将无法安全地检测服务器是否正在实施老办法只,或新的为好。
要添加新的功能,以IBaseInterface
,你需要创建一个新的接口,但不改变你的现有层次结构。 你可以做的反而是有一个实现类 IBaseInterface
也实现了新的接口为好,如:
type
IBaseInterface = interface
...
end;
IBaseInterface2 = interface(IBaseInterface)
...
end;
IDerivedInterface = interface(IBaseInterface)
...
end;
TBaseClass = class(TInterfacedObject, IBaseInterface, IBaseInterface2)
...
end;
TDerivedClass = class(TBaseClass, IDerivedInterface)
...
end;
这样一来,想要使用新的任何代码IBaseInterface2
功能可以查询任何IBaseInterface
该接口,如果成功,则使用新的功能,如:
var
Base2: IBaseInterface2;
begin
if Supports(AnyBaseOrDerivedInterfacePtr, IBaseInterface2, Base2) then
begin
// use Base2 as needed...
end;
end;
文章来源: COM: If I change the parent of an Interface do I need to create a new Interface?