неявная и явная реализация интерфейса

Возможное дублирование:
C #: интерфейсы - неявные и явные реализация

Не мог бы кто-нибудь объяснить различия между этими двумя зверями и способы их использования. AFAIK, многие классы до 2.0 были реализованы без общих типов, что привело к тому, что последняя версия реализовала оба варианта интерфейсов. Это единственный случай, почему их нужно использовать?

Можете ли вы также подробно объяснить, как их использовать?

Спасибо


person Community    schedule 28.02.2009    source источник


Ответы (3)


Есть хороший и довольно подробный блог написать об этом.

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

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

Приведенные ниже правила взяты из Брэда Абрамса блог с рекомендациями по дизайну.

  • Не используйте явные члены в качестве границы безопасности. Они могут быть вызваны любым клиентом, который привел экземпляр к интерфейсу.
  • Использовать явные члены, чтобы скрыть детали реализации
  • Обязательно используйте явные члены, чтобы приблизиться к реализациям частного интерфейса.
  • Обязательно предоставьте альтернативный способ доступа к любым явно реализованным членам, которые подклассам разрешено переопределять. Используйте то же имя метода, если не возникнет конфликт.

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

person Andrew Barrett    schedule 28.02.2009
comment
Спасибо !! это объясняет довольно четко. Одно замечание - разве не точка: 2 и 3 означают одно и то же? - person rahulaga_dev; 11.03.2018

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

Неявная реализация интерфейса

public class MyClass : InterfaceOne, InterfaceTwo
{
    public void InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}

interface InterfaceOne
{
    void InterfaceMethod();
}

interface InterfaceTwo
{
    void InterfaceMethod();
}

Явная реализация интерфейса

public class MyClass : InterfaceOne, InterfaceTwo
{
    void InterfaceOne.InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }

    void InterfaceTwo.InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}

interface InterfaceOne
{
    void InterfaceMethod();
}

interface InterfaceTwo
{
    void InterfaceMethod();
}

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

person Suresh    schedule 21.09.2012

Есть еще один способ взглянуть на это, исходя из самой реализации лабиринта, здесь: http://blogs.msdn.com/cbrumme/archive/2003/05/03/51381.aspx.

Но короче говоря, неявная реализация дает вам преобразование типа is-a, явная реализация не будет доступна, если объект явно не приведен к этому типу интерфейса.

person Tanveer Badar    schedule 01.03.2009
comment
Разрешение конфликтов здесь ..... Неявная реализация - означает простую реализацию определенного метода с тем же именем и такой же сигнатурой, который принадлежит к тому же самому классу, тогда как явная реализация - означает реализацию метода с использованием имени интерфейса с таким же именем и подпись в этом конкретном классе. - person Kush Kant Dayal Pune; 03.02.2017