我正在开发一个实现内部接口的内部类。 任何人都可以解释为什么我不能将我的方法声明为内部,为什么我收到以下错误:“无法实现接口成员,因为它不公开”。
我知道我必须将该方法声明为公开,但这对我来说绝对没有意义。
如果接口和类都是内部的,那么声明方法是公共的有什么意义? 这不是误导吗?
我看过a related question on this site。这不完全是重复的,因为我的班级是内部的。
答案 0 :(得分:11)
简单地说:因为这是语言设计者设计它的方式。即使在内部接口中,这些方法也是隐式公开的。它确实使事情变得简单,但在其他方面却是一种痛苦。
如果你想要一个你想“隐藏”内部接口使用的公共类,你可以使用显式接口实现 - 虽然这有其他缺点。
当然,如果你的类是内部的,那么方法是公共的并不重要 - 其他程序集也无法调用方法,因为它们看不到类型。
我绝对同意C#(或一般的.NET)的设计并不像内部接口那样谨慎。
就完全而言,您收到错误消息的原因 - C#4规范(接口映射)的第13.4.4节是原因。只有非静态公共成员和显式接口成员实现才能找到实现 - 如果接口中有任何未实现的成员,则会发生错误。
答案 1 :(得分:0)
我知道这很老了,但也许有人觉得有用。您可以完成一种内部接口方法,如下所示:
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派生,如果您需要另一个基类,这可能是个问题。
但是,我发现如果抽象基类是泛型基类而不是接口,则将很有帮助。也许在某些情况下有用。