繁体   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