Подтвердить что ты не робот

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

Во время обновления я столкнулся с таким кодом.

interface ICustomization
    {
        IMMColumnsDefinition GetColumnsDefinition();
    }

    class Customization : ICustomization
    {
        private readonly ColumnDefinition _columnDefinition;

        //More code here.

        public ColumnsDefinition GetColumnsDefinition()
        {
            return _columnDefinition;
        }

        ColumnsDefinition ICustomization.GetColumnsDefinition()  //redundant
        {
            return GetColumnsDefinition();            
        }
    }

Мой вопрос: Есть ли необходимость/использование "явной" реализации интерфейса в этом фрагменте кода? Будет ли она создавать какие-либо проблемы, если я удалю метод (явная реализация интерфейса), который я обозначил "избыточным" выше?

PS: Я понимаю, что явная реализация интерфейса очень важна, и его можно использовать, когда нам нужно предоставить доступ к методу только на уровне интерфейса и использовать два интерфейса с одной и той же сигнатурой метода.

4b9b3361

Ответ 1

Угу. Выглядит излишним.

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

Customization oVar = new Customization();
oVar.GetColumnsDefinition(); // calls 1st method
ICustomization iVar = obj;
iVar.GetColumnsDefinition(); // calls 2nd method - explicit impl.

Вы должны удалить явную реализацию. Однако, если вы удалите другую реализацию, вы будете ограничивать клиентов таким образом, чтобы они больше не могли вызывать oVar.GetColumnsDefintion() - им пришлось бы использовать переменную интерфейса, как показано выше.

Ответ 2

Для информации, в основное время, когда вы видите, что определенный шаблон - когда (любой из):

  • неявный метод virtual или abstract, для подклассов override
  • подпись метода public не совсем то же самое, например, публичный API имеет более специфический тип возврата (общий для таких вещей, как IEnumerable[<T>] или ICloneable).
  • мы не хотим, чтобы он был public, но мы хотим, чтобы он легко вызывался в типе (без необходимости nop-cast)

В этом случае он действительно выглядит излишним.