【问题标题】:Can't Inherit an interface with hidden methods无法继承具有隐藏方法的接口
【发布时间】:2013-06-11 14:57:54
【问题描述】:

我正在使用 VS 2010 编写一个 C# 类库。我正在引用一个我认为是用非托管编译器编写的 DLL,因为我不相信您可以在 .NET 托管代码中将方法标记为私有。

当我尝试从引用的 DLL 继承接口并实现抽象类时,它抱怨我没有实现特定的方法。我手动尝试了,但签名显然不匹配,因为它说没有找到合适的方法来覆盖。

'xxx.xxx.xxx.xxx' 没有实现继承的抽象成员'xxx.xxx.xxx.Foo(string, xxx.xxx.xxx)'

我使用对象浏览器进行了搜索,发现它对我不可用。它被隐藏可能是因为它不应该被继承?

我必须想办法让这项工作发挥作用。如何找到正确的签名?

提前感谢您在此问题上的帮助 mj

【问题讨论】:

  • 你搞错了。您从抽象类继承并实现接口。请发布一些代码,以便我们查看您遇到的问题。
  • 我们需要看到真正的声明,包括所有的修饰符。否则无法提供帮助。 (真正的错误信息也有帮助)
  • 能否请您发布一些代码。接口声明以及实现接口的代码。
  • 更正:我使用对象浏览器搜索并意识到它对我不可用。它被隐藏可能是因为它不应该被继承?
  • 错误信息表明您需要实现一个abstract 方法。您是说该方法是您引用的 DLL 中的private(或internal?)吗?这不是一个很明确的问题。

标签: c# .net class interface


【解决方案1】:

根据您提供的有限信息,我的猜测是 DLL 有一个类似于以下内容的类:

namespace Xxx
{
  public abstract class TheirType
  {
    // accessible instance constructor
    protected TheirType()
    {
    }

    // inaccessible abstract member
    internal abstract void TheMethod()
    {
    }
  }
}

这让人们首先认为他们可以从程序集外部的TheirType 派生,因为该构造函数是可访问的。但是他们没有机会实现抽象成员 TheMethod,因为在另一个程序集中无法访问 internal 成员。

如果TheirType的作者也可以,那就更友好了

  • 决定它们的类型应该允许从外部继承,因此将TheMethod设为publicprotected internalprotected;或
  • 使所有实例构造函数无法从外部访问,即internalprivate,以表明它们不允许人们从其他程序集继承TheirType

【讨论】:

  • 感谢 Jeppe 的回复,很有道理。
猜你喜欢
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 2011-04-18
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
相关资源
最近更新 更多