c# - 嵌套接口(interface)和抽象实现类

标签 c# c#-4.0 interface abstract-class nested-class

当我尝试使用抽象类实现嵌套接口(interface)时,我在 C# 4.0 中意外遇到了这一点:

public class A
{
    public interface InnerInterface
    {
        void Method();
    }
}

public abstract class B : A.InnerInterface
{
    public abstract void A.InnerInterface.Method();
}

public class C : B
{
    public override void A.InnerInterface.Method()
    {
        System.Console.WriteLine("C::A.InnerInterface.Method()");
    }
}

不幸的是,上面的代码无法编译,并出现以下错误:

error CS0106: The modifier 'abstract' is not valid for this item

error CS0106: The modifier 'public' is not valid for this item

error CS0106: The modifier 'override' is not valid for this item

error CS0106: The modifier 'public' is not valid for this item

但是,如果接口(interface)是非嵌套接口(interface),如下所示:

public interface SomeInterface
{
    void Method();
}


public abstract class B : SomeInterface
{
    public abstract void Method();
}

public class C : B
{
    public override void Method()
    {
        System.Console.WriteLine("C::Method()");
    }
}

编译成功。

为什么第一种情况会出现编译错误?我在这里错过了什么吗?或者说不允许用抽象类实现嵌套接口(interface)?

最佳答案

问题不在于嵌套,而在于显式接口(interface)实现。如果您将“工作”示例更改为使用:

public abstract void SomeInterface.Method()

你会看到同样的问题。您应该能够轻松地使用带有嵌套接口(interface)的隐式接口(interface)实现:

public abstract class B : A.InnerInterface
{
    public abstract void Method();
}

public class C : B
{
    public override void Method()
    {
        System.Console.WriteLine("C::A.InnerInterface.Method()");
    }
}

...如果您想要使用显式接口(interface)实现,则嵌套接口(interface)的工作方式应该与非嵌套接口(interface)的工作方式相同。但是您不能在显式接口(interface)实现上编写 public,而且它们也不能是抽象的 (IIRC)。

关于c# - 嵌套接口(interface)和抽象实现类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12345158/

相关文章:

c# - NHibernate 查询以获取具有与字符串部分匹配的属性的对象

c# - 如何在静态属性中使用NotifyOfPropertyChange(Caliburn Micro)

c# - 当无法找到请求的 PostgreSQL 表时,如何捕获异常并使用错误代码?

wpf - WPF将主题应用于特定项目而不是整个应用程序

c#-4.0 - 计算将一个矩形的 point1( x,y 坐标) 转换为另一个矩形的 Point1( x,y) 的比例因子

c# - C# 中的接口(interface)与多重继承

Delphi 界面帮助程序/解决方法

c# - 是否可以在 Regex 中执行此操作

c# - 循环浏览以编程方式创建的文本框时出现“无法转换对象”

interface - 公开 Protocol Buffer 接口(interface)