簡體   English   中英

實現從非泛型接口繼承的通用接口

[英]implementing a generic interface that inherits from a non generic one

我知道如何實現一個繼承非通用接口的通用接口,但是在這個過程中有一些我不理解的東西:

為什么在實現接口的類中不能將非泛型接口方法聲明為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(); }
    }

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

編譯器抱怨的原因:

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; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM