2016-03-03 4 views
4

Я знаю, как реализовать общий интерфейс, который наследуется образуют не один общий, но есть что-то я не понимаю в этом процессе:реализует общий интерфейс, который наследует от не родового один

Почему, не общий интерфейс метод не должен быть объявлен как открытый в классе, реализующем интерфейсы ?.

Пример:

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 Type «FloatInputSocketValues» уже определяет элемент, называемый «ПолучитьЗначение» с теми же типами параметров

является то, что вы не можете отличаться между двумя членами по их возвратным типам, и если вы сделаете этот метод общедоступным, вы получите:

//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 для устранения неоднозначности в нижней части, что это не проблема вокруг дженериков, в частности. –

Смежные вопросы