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

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

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

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

Спасибо

Ответ 1

Существует хорошее и довольно подробное сообщение в блоге об этом.

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

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

Ниже приведены правила от Brad Abrams блог рекомендаций по дизайну.

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

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

Ответ 2

В условиях непрофессионала, если класс наследует от 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();
}

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

Ответ 3

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

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