2016-02-18 57 views
3

以下代碼是一個有效的C#構造,可以很好地編譯。爲什麼類可以在C#中實現自己的私有嵌套接口?

public class Weird : Weird.IWeird 
{ 
    private interface IWeird 
    { 
    } 
} 

這會有什麼用?

編輯:這個問題更具體一點,這一個:「What is a private interface?」。它表明可以從父類型本身實現一個私有接口,這似乎是毫無意義的。我能想到的唯一用途是接口隔離的奇怪情況,您希望將父類的實例傳遞給嵌套類實例,如IWeird

+2

[什麼是私有接口?](http://stackoverflow.com/questions/792908/what-is-a-private-interface) –

+2

如果您有嵌套的私有類實現接口,你也許想通過專用接口傳遞'this'或該類的一個實例嗎?相當深奧的東西,但:-) – Haukinger

+1

這是什麼問題?公共類可以實現私人界面嗎?一個類可以實現一個嵌套的接口?只是這兩者的結合? –

回答

3

這可能是編譯器開發中的這些情況之一,當禁止某些東西比允許它的成本更高時。禁止這種使用需要編寫和維護代碼來檢測這種情況,並報告錯誤;如果該功能按原樣工作,這對團隊來說是一項額外的工作,可以避免。畢竟,也許有想象力的人可能會想出使用該功能的方法。

至於一個有用的例子推移,一個潛在用途是使在類另一實現中,並用它作爲一種替代,而不將其暴露於API的用戶:

public class Demo : Demo.Impl { 
    // Private interface 
    private interface Impl { 
     public bool IsValidState {get;} 
     void DoIt(); 
    } 
    // Implementation for the error state 
    private class Error : Impl { 
     public bool IsValidState { get { return false; } } 
     public void DoIt() { 
      Console.WriteLine("Invalid state."); 
     } 
    } 
    private readonly string name; 
    // Implementation for the non-error state 
    public bool IsValidState { get { return true; } } 
    public void DoIt() { 
     Console.WriteLine("Hello, {0}", name); 
    } 
    // Constructor assigns impl depending on the parameter passed to it 
    private readonly Impl impl; 
    // Users are expected to use this method and property: 
    public bool IsValid { 
     get { 
      return impl.IsValidState; 
     } 
    } 
    public void SayHello() { 
     impl.DoIt(); 
    } 
    // Constructor decides which impl to use 
    public Demo(string s) { 
     if (s == null) { 
      impl = new Error(); 
     } else { 
      impl = this; 
      name = s; 
     } 
    } 
} 

至於最佳實踐去了,這種設計充其量也是有問題的。特別是,我會爲非錯誤實現創建第二個嵌套類,而不是爲此目的重用主類。然而,這個設計沒有什麼錯誤(除了事實上,IsValidStateDoIt都是可見的),所以C#團隊可以允許這種使用。

相關問題