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

(How) Can I implement a method called Dispose in 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 似乎很矛盾...

我是不是遗漏了什么,或者这根本不可能吗?

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

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

如果您无法更改界面

并且接口 Dispose 的语义非常接近 IDispose::Dispose

并且您可以忍受它带来的所有处置模式副作用,

THEN 为您的 class 声明一个析构函数将创建一个名为 Dispose 的方法来满足您的接口。

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

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

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