(如何)我可以在C ++中实现一个名为Dispose的方法.CLI

时间:2017-05-10 15:09:17

标签: c++-cli

我有一个接口,而不是IDisposable,它有一个方法void Dispose()。我想在C ++ / CLI中实现这个接口。看来我做不到。我试过了

    virtual void Finish() = IThing::Dispose 
    {}

但是这会产生许多错误:

1>...: error C2039: 'Dispose': is not a member of '...IThing'
1>...: error C3653: 'Dispose': cannot be used as a named override: a function being overridden not found; did you forget to name the function explicitly, using a:: operator?
1>...: error C3766: 'MyNamespace::MyClass' must provide an implementation for the interface method 'void ...IThing::Dispose(void)'

(匿名)。 C2039和C3766看似矛盾......

我错过了什么或者这是不可能的?

虽然我接受这是一个糟糕的设计决定,但更改界面不是一个选项,它是由数百个库类实现的。

2 个答案:

答案 0 :(得分:1)

Dispose是一个保留字,不能用于显式覆盖。最好的答案是取消问题并更改界面。 然而,

如果您无法更改界面

并且界面Dispose的语义足够接近IDispose::Dispose&#39>

你可以忍受它带来的所有处理模式副作用,

然后为您的类声明析构函数将创建一个名为Dispose的方法,该方法将满足您的接口。

答案 1 :(得分:0)

使用 IDisposable 方法实际实现除 Dispose 之外的接口的唯一方法是:

  1. 使用另一种 .NET 语言(可能是 C#)引入一个基类,可能是抽象的,它通过转发到具有不同名称(可能是 Dispose)的抽象虚函数来实现 IThingDisposal 方法。
  2. 在 C++/CLI 中,从该基类继承并将您的 Dispose 实现置于步骤 1 中命名的方法的覆盖中。

如果您已经有一个基类,则步骤 1 中的新基类应该从旧基类继承,从而创建间接继承。如果您已经有一个在同一个 C++/CLI 程序集中实现的基类,那么您将受到很大的伤害,因为您必须将程序集拆分为另一种语言可以使用的程序集和一个将使用程序集的程序集其他语言的基类。我不羡慕你。