实现内部接口的公共抽象类中的抽象方法不编译?

时间:2016-01-27 15:01:10

标签: c# inheritance

internal interface I_Foo
{
    void Bar();
}

public abstract class A_Foo : I_Foo
{
    public A_Foo() { }
    abstract void I_Foo.Bar();
}

public class Foo : A_Foo
{
    public Foo() : base() { }
    internal override void Bar()
    {

    }
}

您好!我试图让一些方法对外部代码可见,而其他方法只对我的程序集可见。为此,我创建了一个内部接口I_Foo作为程序集其他部分的契约,一个公共抽象A_Foo作为外部代码的抽象,集中了一些构造函数,以及实现A_Foo和I_Foo的几个不同的类Foo明确保留内部修饰符。

然而,在A_Foo类中,我得到了

  

' A_Foo.I_Foo.Bar()'必须声明一个正文,因为它没有标记为abstract,extern或partial

即使该方法明确标记为" abstract"。如果我添加一个正文,我会得到"抽象不是一个有效的修饰符"。

我需要显式声明这个方法,以便在公共类中内部,我需要它是抽象的,所以我可以在实际的实现Foo中覆盖它。

为什么编译器不允许我这样做? 还有另一种方法可以达到同样的目的吗? 谢谢。

2 个答案:

答案 0 :(得分:11)

显式接口实现总是必须具有实际的实现。这里的诀窍是让它只调用非显式(内部)抽象方法:

public abstract class A_Foo : I_Foo
{
    // Classes outside the assembly can't derive from A_Foo
    // anyway, so let's make the constructor internal...
    internal A_Foo() { }

    void I_Foo.Bar()
    {
        Bar(); // Just delegate to the abstract method
    }

    internal abstract void Bar();
}

这仍允许I_Foo使用内部类型等,因为Bar永远不会公开曝光 - 但它符合该语言的其他规则。

答案 1 :(得分:3)

该方法不能是抽象的。问题是您尝试使用显式接口实现(void I_Foo.Bar)。这些方法以后不能覆盖 - 因此必须实施。

如果您直接声明Bar(void Bar()),那么它可以是抽象的。