5

我正在开发一个实现内部接口的内部类。谁能解释为什么我不能将我的方法声明为内部方法,为什么会出现以下错误:“无法实现接口成员,因为它不是公共的”。

我知道我必须将该方法声明为公共的,但这对我来说绝对没有意义。

如果接口和类都是内部的,那么将方法声明为 public 有什么意义?这不是误导吗?

在这个网站上阅读了一个相关的问题。它不是完全重复的,因为我的课程是内部课程。

4

2 回答 2

13

简单地说:因为这是语言设计者设计它的方式。即使在内部接口中,方法也是隐式公开的。它确实使事情变得简单,但在其他方面却很痛苦。

如果你想要一个公共类来“隐藏”内部接口的使用,你可以使用显式接口实现——尽管这有其他缺点。

当然,如果您的类是内部的,那么无论如何方法是公共的都没有关系 - 其他程序集将无法调用这些方法,因为它们看不到类型。

我绝对同意 C#(或一般的 .NET)没有像围绕内部接口那样精心设计。

就您收到错误消息的确切原因而言 - C# 4 规范(接口映射)的第 13.4.4 节是原因。仅针对非静态公共成员和显式接口成员实现找到实现 - 如果接口中有任何未实现的成员,则会发生错误。

于 2012-06-22T18:51:56.860 回答
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 派生,如果您需要另一个基类,这可能是一个问题。

但是我发现如果抽象基类是通用的而接口不是,它会很有帮助。也许它在某些情况下很有用。

于 2020-03-27T18:03:23.190 回答