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(); } |
这仍然允许
方法不能是抽象的。问题是您试图使用显式接口实现(void i_foo.bar)。这些方法以后不能被覆盖-因此必须实现它们。
如果您直接声明BAR(