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

При работе над обновлением я, оказалось, сталкивался с кодом как это.

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: Я понимаю, что явная реализация интерфейса очень важна, и это может использоваться, когда мы должны предоставить доступ к методу на интерфейсном уровне только, и использовать два интерфейса с той же подписью метода.

12
задан Manish Basantani 3 May 2010 в 06:46
поделиться

2 ответа

Ага. Выглядит излишне.

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

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

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

8
ответ дан 2 December 2019 в 21:42
поделиться

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

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

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

4
ответ дан 2 December 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: