2016-03-03 108 views
4

我知道如何實現一個通用的接口,它繼承了形成非通用的一個,但有些事我不要在此過程中瞭解繼承:實現一個通用的接口,從非通用一個

爲什麼非通用接口方法不能在實現接口的類中聲明爲public?

一個例子:

interface InputTestSocket 
    { 
     object GetValue(); 
    } 

    interface InputTestSocket<T> : InputTestSocket 
    { 
     new T GetValue(); 
    } 

    class FloatInputSocketValues : InputTestSocket<float> 
    { 
     IFloatConvertable _output; 
     public void SetConvertable(IFloatConvertable output) { _output = output; } 

     //If I make this method public it won't compile. Musn't all interfaces be public? 
     object InputTestSocket.GetValue() { return null; } 

     public float GetValue() { return _output.ToFloat(); } 
    } 

回答

3

這就是所謂的顯式實現的接口。當您不會(或不能)將成員公開爲具體類型的實例成員時,您可以這樣做,但只能通過接口使它們可用。

編譯器與此抱怨的原因:

CS0111型「FloatInputSocketValues」已經定義了一個名爲「的GetValue」具有相同的參數類型

件,你不能兩個成員之間的差異只有他們的返回類型,如果你公開的方法,你會有:

//If I make this method public it won't compile. Musn't all interfaces be public? 
public object GetValue() { return null; } 

public float GetValue() { return _output.ToFloat(); } 

和這兩個不同他們的返回類型。

所以你不能這樣做。

你不能這樣做的原因是,當編譯器試圖確定你想,當你這樣做是爲了調用哪個方法:

something.GetValue() 

的是,它不考慮返回類型都。編譯器因此告訴你,你永遠無法調用這個方法,因爲它不明確,因此它不允許你這樣做。

這有什麼好做仿製藥或繼承,雖然,你會得到完全一樣的問題,這個小例子:

interface ITest 
{ 
    object GetValue(); 
} 

public class Test : ITest 
{ 
    public object GetValue() { return null; } 

    // just a public method on our class 
    public float GetValue() { return 0.0f; } 
} 
+0

希望我能在底部提供消歧的額外+1,這是不是泛型的問題,特別是。 –