为什么实现内部接口的方法必须是公共的?

6
我正在开发一个实现内部接口的内部类。有人能解释一下为什么我不能将我的方法声明为internal,我为什么会得到以下错误:“无法实现接口成员,因为它不是公共的”。
我知道我必须将该方法声明为public,但这对我来说毫无意义。
如果接口和类都是internal,那么声明一个public方法的意义是什么?这不是误导吗?
我已经阅读了本站上相关问题。虽然我的类是internal,但它并不是完全重复的。

1
一个接口是不是 internal 对它作为接口的本质有何影响? - BoltClock
@BoltClock 我不希望任何东西公开。内部是更好的选择。 - Arne Lund
2个回答

13
简单来说:因为语言设计者就是这样设计的。即使在内部接口中,方法也默认是公共的。这确实让事情变得简单,但也有其它方面的痛点。
如果你想要一个公共类,在其中“隐藏”使用内部接口,你可以使用显式接口实现,尽管这样做也有其它缺点。
当然,如果你的类是内部的,那么方法是公共的就无所谓了——其它程序集不能调用该类型中的方法,因为它们看不到该类型。
我肯定同意 C#(或 .NET 一般)在内部接口方面没有像可能那样仔细地设计。
至于为什么会收到错误消息的确切原因——C# 4 规范的第 13.4.4 节(接口映射)是原因。只有非静态公共成员和显式接口成员实现才能够被找到,而且如果接口中存在未实现的成员,则会发生错误。

Jon,你能解释一下你所说的“它确实使事情变得简单,但在其他方面却很麻烦”是什么意思吗? - Arne Lund
4
显式接口实现有时会产生令人惊讶的结果,使得在派生类中提供接口的实现并首先调用基类中现有的实现变得困难/不可能。它还无法适应动态类型。 - Jon Skeet
非常感谢!我一直在想为什么这种看似一致的行为被认为是不合法的。你已经解释了C#并没有像它应该做的那样仔细设计。对我来说很有道理。祝你周末愉快! - Arne Lund

1

我知道这篇文章有点旧,但希望对某些人有所帮助。你可以通过以下方式实现一种内部接口方法:

internal interface IFoo
{
    void MyMethod();
}

public abstract class Foo : IFoo
{
    void IFoo.MyMethod()
    {
        MyMethod();
    }

    internal abstract void MyMethod();
}

所以你所有的内部类都应该派生自Foo并强制实现抽象的MyMethod。但你当然可以将它们全部视为IFoo。但是那些在程序集外的类不会提供MyMethod类。
因此,您有优势可以将类内部视为IFoo并依赖于MyMethod。缺点是所有类都需要派生自Foo,如果您需要另一个基类,则可能会出现问题。
但我发现如果抽象基类是泛型的,接口不是泛型的,则会很有帮助。也许在某些情况下有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接