2012-09-10 168 views
2

我碰到这在C#4.0中意外地来了,当我试图实现与抽象类的嵌套接口:嵌套接口和抽象实现类

public class A 
{ 
    public interface InnerInterface 
    { 
     void Method(); 
    } 
} 

public abstract class B : A.InnerInterface 
{ 
    public abstract void A.InnerInterface.Method(); 
} 

public class C : B 
{ 
    public override void A.InnerInterface.Method() 
    { 
     System.Console.WriteLine("C::A.InnerInterface.Method()"); 
    } 
} 

不幸的是,上面的代码无法编译,用下面的错误:

错误CS0106:修饰语“抽象”是无效的这个项目

错误CS0106:修饰词“公众”并不适用于这个项目

错误CS0106:修饰语“覆盖”是不适用于这个项目

错误CS0106:修饰词“公众”并不适用于这个项目

但是如果界面是不是非这样的接口,像这样:

public interface SomeInterface 
{ 
    void Method(); 
} 


public abstract class B : SomeInterface 
{ 
    public abstract void Method(); 
} 

public class C : B 
{ 
    public override void Method() 
    { 
     System.Console.WriteLine("C::Method()"); 
    } 
} 

它编译好。

为什么编译器在第一种情况下出错?我在这里错过了什么吗?还是不允许用抽象类实现嵌套接口?

回答

3

问题不在嵌套 - 它与显式接口实现。如果你改变你的“工作”示例使用:

public abstract void SomeInterface.Method() 

你会看到同样的问题。您应该能够使用隐式接口实现与嵌套接口简单:

public abstract class B : A.InnerInterface 
{ 
    public abstract void Method(); 
} 

public class C : B 
{ 
    public override void Method() 
    { 
     System.Console.WriteLine("C::A.InnerInterface.Method()"); 
    } 
} 

...如果你想使用显式接口实现,它应该以同样的方式工作了嵌套接口作为非嵌套的一个。但是你不会在明确的接口实现上写public,它们也不能抽象(IIRC)。

+0

谢谢。不知道C#中有隐式/显式接口实现 –