【发布时间】:2013-08-10 11:12:10
【问题描述】:
现有的答案涵盖了一般情况,但它们有些模糊,我需要确定这一点。
考虑:
- 从抽象基类“接口”派生的现有定义类。
- 类是库的一部分,它被编译成多个 dll,这些 dll 通过接口相互通信。
然后添加:
- 现在将派生定义的类的第二个“接口”(因此现在它有两个接口)。
- 新接口访问的已定义类的新虚拟方法。
我需要重新编译链接这个库的每个 dll,还是只需要重新编译使用新方法的 dll?
编辑:
我的原始界面公开了一个动态方法 Dynamic(int OP, void* args) 是否可以添加一个转换为新界面的操作?
COM 如何在不破坏现有接口的情况下向对象添加新接口?是否堆叠接口、使用多重继承等???
让我介绍一下它的工作方式。
静态链接库接口
In statically linked library
class Interface1
{
virtual Method1() = 0;
virtual Method2() = 0;
}
class NotReallyInterface2 : Interface1
{
virtual Method1() = 0;
virtual Method2() { // does something }
}
在 dll 中
In A.dll
Load statically linked library
class A : NotReallyInterface2
{
virtual Method1() { // does something }
}
In B.dll
Load statically linked library
class B: NotReallyInterface2
{
virtual Method1() { // does something different }
}
我要添加
class Interface3
{
virtual Method3() = 0;
}
我这里有一些问题,因为我的继承结构看起来像。
[a.dll [ library : Interface1 < NotReallyInterface2 ] < A ]
[b.dll [ library : Interface1 < NotReallyInterface2 ] < B ]
所以我害怕
[ a.dll [ library : Interface1 < NotReallyInterface2 ] < Interface3 < A ]
不会工作。
编辑 2
所以我发现了我的问题。显然,其他 dll 和可执行文件正在引用我的 NotReallyInterface2。这意味着多个 dll 和 exe 正在构建相同的基类。因此,如果这些基类的“副本”不同步,那么这艘船就会失败。这意味着我无法更改 NotReallyInterface2 中的单个方法签名。
如果没有人引用 NotReallyInterface2,这会奏效,我现在从答案中得到了这一点,整个事情都说得通了。
【问题讨论】:
-
这就是为什么尽早让您的接口正确非常重要的原因。
-
@NeilKirk 这是一个已建立接口的问题,我需要在该类中添加新功能并能够访问它们。
-
COM 是一个完全不同的问题。记住 COM 是跨语言的(VB 和 C++ 以及 C# 应用程序都可以使用 COM 对象。)“COM 是如何做到的?”的完整答案问题不仅仅是对 StackOverflow 的评论。阅读 IUnknown 并了解它的作用以及他们为什么需要它。