2016-03-03 97 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,这是不是泛型的问题,特别是。 –