Looking for c# Keywords? Try Ask4Keywords

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


пример

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

interface IChauffeur 
{
    string Drive();
}

interface IGolfPlayer
{
    string Drive();
}

class GolfingChauffeur : IChauffeur, IGolfPlayer 
{
    public string Drive()
    {
        return "Vroom!";
    }

    string IGolfPlayer.Drive()
    {
        return "Took a swing...";
    }
}


GolfingChauffeur obj = new GolfingChauffeur();
IChauffeur chauffeur = obj;
IGolfPlayer golfer = obj;

Console.WriteLine(obj.Drive()); // Vroom!
Console.WriteLine(chauffeur.Drive()); // Vroom!
Console.WriteLine(golfer.Drive()); // Took a swing...

Реализация не может быть вызвана нигде, кроме как с помощью интерфейса:

public class Golfer : IGolfPlayer
{
    string IGolfPlayer.Drive()
    {
        return "Swinging hard...";
    }
    public void Swing()
    {
        Drive(); // Compiler error: No such method
    }
}

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

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

public class ProGolfer : IGolfPlayer
{
    string IGolfPlayer.Swear() // Error
    {
        return "The ball is in the pit";
    }
}

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

Подсказка:

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

Замечания:

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