2017-01-14 2 views
2

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

Имея код:

interface InterfaceOne 
{ 
    void MethodOne(); 
} 

class ClassOne : InterfaceOne 
{ 
    public void MethodOne() 
    { 
     Console.WriteLine("hello from the class method"); 
    } 

    void InterfaceOne.MethodOne() 
    { 
     Console.WriteLine("hello from the interface method"); 
    } 
} 

И код из основного метода:

var c1 = new ClassOne(); 
    c1.MethodOne(); 

    InterfaceOne i1 = new ClassOne(); 
    i1.MethodOne(); 
    Console.ReadLine(); 

А вот выход:

привет из метода класса

привет от метода интерфейса

Мои вопросы:

  1. Почему у меня нет ошибки, имеющей класс с двумя методами с тем же именем и подписью?

  2. Когда я использую ключевое слово var, как компилятор выбирает, какой метод вызывать?

  3. Каковы преимущества?

+0

@MarcinJuraszek это не дубликат, потому что вопрос, который вы упомянули, не отвечает на мой второй вопрос –

ответ

1

Почему у меня нет ошибки, связанной с классом с двумя методами с тем же именем и подписью?

Потому что именно так работает явная реализация интерфейса. Это позволяет вам иметь две версии одного и того же метода. Используемый метод определяется тем, какой тип ссылки использовался для его вызова.

Когда я использую ключевое слово var, как компилятор выбирает, какой метод вызывать?

Использование термина типа. В documentation указывается:

Локальным переменным может быть задан выведенный «тип» var вместо явного типа. Вар ключевое слово указывает компилятору вывести тип переменной из выражения в правой части оператора инициализации

Так его будет использовать любой тип правая рука возвращается

Что выгоды?

В основном, нет. Но если вы хотите, чтобы ваш объект действовал по-разному при доступе через определенный интерфейс, это способ сделать это.

+0

Можете ли вы дать мне ссылку, в которой говорится, что «компилятор выбирает наиболее производный возможный выбор»? –

+0

@BudaGavril Плохо, похоже, что он использует все, что есть справа. Добавлена ​​ссылка в любом случае – BradleyDotNET

0

Выгода Явного заключается в том, что иногда вам это нужно, чтобы разрешать двусмысленности. Представьте себе сценарий, в котором вам нужно реализовать два разных интерфейса в одном классе, которые имеют метод с тем же именем.

Это что-то еще, потому что иногда это необходимо, а не потому, что это должен быть план А вашего дизайна.

1

Почему у меня нет ошибки, связанной с классом с двумя методами с именем с тем же именем и подписью?

Потому что вы используете функцию языка, которая позволяет это.

Когда я использую ключевое слово var, как компилятор выбирает, какой метод позвонить?

Использование var здесь не имеет значения. Все, что имеет значение, это тип переменной, по которой вызывается метод.

var c1 = new ClassOne(); 
InterfaceOne i1 = new ClassOne(); 

var c1Result = c1.MethodOne(); 
var c2Result = c2.MethodOne(); 

Каковы преимущества?

Это в основном предназначено для обеспечения реализации несколько интерфейсов с тем же методом:

interface One { 
    int Foo(); 
} 

interface Two { 
    int Foo(); 
} 

Без явной реализации интерфейса вы не могли бы иметь класс, который реализует как и обеспечивает различные реализации для них ,