关于c#:实现内部接口的公共抽象类中的抽象方法不能编译?

Abstract method in public abstract class implementing an internal interface doesn't compile?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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,作为外部代码的抽象,并集中一些构造函数功能,以及几个不同的类foo,它们显式地实现一个foo和i_foo以保留内部修饰符。

但是,在A-foo课上,我

'A_Foo.I_Foo.Bar()' must declare a body because it is not marked abstract, extern, or partial

即使该方法被清楚地标记为"抽象"。如果我添加一个主体,我会得到"abstract不是有效的修饰符"。

我需要显式声明这个方法,以便在公共类中是内部的,我需要它是抽象的,以便在实际的实现foo中重写它。

为什么编译器不让我?有没有其他方法可以实现同样的目标?谢谢您。


显式接口实现总是必须有实际的实现。这里的技巧是让它调用一个非显式(内部)抽象方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
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从未公开-但它符合语言的其他规则。


方法不能是抽象的。问题是您试图使用显式接口实现(void i_foo.bar)。这些方法以后不能被覆盖-因此必须实现它们。

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