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

本文关键字:抽象方法 编译 内部 接口 实现 抽象类 | 更新日期: 2023-09-27 18:32:11

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,它们显式地实现A_Foo和I_Foo以保留内部修饰符。

但是,在A_Foo课上,我得到了

'A_Foo.I_Foo.Bar()' 必须声明一个主体,因为它没有标记为抽象、外部或部分

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

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

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

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

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

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() ),那么它可以是抽象的。