Предназначено ли использование явной реализации интерфейса для сокрытия функциональности? - PullRequest
7 голосов
/ 25 мая 2011

Я использую интерфейсы для развязки своего кода.Мне любопытно, подразумевается ли использование явной реализации интерфейса для сокрытия функциональности?

Пример:

public class MyClass : IInterface
{
     void IInterface.NoneWillCall(int ragh) { }
}

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

Ответы [ 4 ]

11 голосов
/ 25 мая 2011

В моем опыте есть два основных применения:

  • Позволяет перегружать методы возвращаемым значением. Например, IEnumerable<T> и IEnumerable оба объявляют GetEnumerator() методы, но с разными типами возвращаемых значений - поэтому для реализации обоих вы должны явно реализовать хотя бы один из них. Конечно, в этом вопросе оба метода предоставляются интерфейсами, но иногда вам просто нужно дать «нормальный» метод с другим типом (обычно более конкретным) для метода из метода интерфейса.
  • Это позволяет вам реализовать часть интерфейса «обескураживающим» способом - например, ReadOnlyCollection<T> реализует IList<T>, но «препятствует» мутирующим вызовам, используя явную реализацию интерфейса. Это будет препятствовать вызывающим сторонам, которые знают об объекте по его конкретному типу, вызывать неподходящие методы. Отчасти пахнет интерфейсами слишком широкими или неправильно реализованными - зачем вам реализовывать интерфейс, если вы не можете выполнить все его контракты? - но в прагматическом смысле это может быть полезно.
4 голосов
/ 25 мая 2011

Один пример: ICloneable .Реализовав его явно, вы можете иметь строго типизированную версию:

public class MyClass : ICloneable {
    object ICloneable.Clone() {
       return this.Clone();
    }

    public MyClass Clone() {
       return new MyClass() { ... };
    }
}
2 голосов
/ 25 мая 2011

Может использоваться для сокрытия.Например, некоторые классы, которые реализуют IDisposable, делают это явно, потому что у них также есть метод Close(), который делает то же самое.

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

2 голосов
/ 25 мая 2011

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

Если у IA и IB есть операция F, вы можете реализовать разные методы для каждого F только путем явной реализации интерфейсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...