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中覆盖它。
为什么编译器不允许我这样做? 还有另一种方法可以达到同样的目的吗? 谢谢。
答案 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()
),那么它可以是抽象的。