【问题标题】:Nested Interface & Abstract Implementation Class嵌套接口和抽象实现类
【发布时间】:2012-09-02 22:25:14
【问题描述】:

当我尝试使用抽象类实现嵌套接口时,我在 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()");
    }
}

很遗憾以上代码编译失败,出现如下错误:

错误 CS0106:修饰符“抽象”对此项无效

错误 CS0106:修饰符“public”对此项目无效

错误 CS0106:修饰符“覆盖”对此项无效

错误 CS0106:修饰符“public”对此项目无效

但是如果接口是非嵌套接口,像这样:

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()");
    }
}

编译成功。

为什么在第一种情况下出现编译器错误?我在这里错过了什么吗?还是不允许用抽象类实现嵌套接口?

【问题讨论】:

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


    【解决方案1】:

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

    public abstract void SomeInterface.Method()
    

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

    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()");
        }
    }
    

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

    【讨论】:

    • 谢谢。不知道 C# 中有隐式/显式接口实现
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2014-02-05
    • 2020-10-20
    • 2012-01-20
    • 1970-01-01
    • 2011-11-20
    • 2017-05-30
    相关资源
    最近更新 更多