2012-09-10 40 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#中有隱式/顯式接口實現 –