неявная и явная реализация интерфейса [дубликат]


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

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

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

спасибо

3 66

3 ответа:

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

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

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

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

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

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

Имплицитная Реализация Интерфейса

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();
}

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

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

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