Если класс реализует IFoo.Bar
явно, и производному классу нужно IFoo.Bar
, чтобы сделать что-то другое, у производного класса не будет способа вызвать реализацию этого метода в базовом классе. Производный класс, который не повторно реализует IFoo.Bar
, может вызвать реализацию базового класса через ((IFoo)this).Bar()
, но если производный класс повторно реализует IFoo.Bar
(как это должно было бы сделать, чтобы изменить его поведение), вышеупомянутый вызов будет идти к повторной реализации производного класса, а не к реализации базового класса. Даже ((IFoo)(BaseType)this).bar
не поможет, поскольку приведение ссылки на тип интерфейса отбрасывает любую информацию о типе ссылки (в отличие от типа экземпляра экземпляра), которая была приведена.
Наличие явной реализации интерфейса ничего не делает, кроме вызова защищенного метода, позволяет избежать этой проблемы, поскольку производный класс может изменить поведение метода интерфейса, переопределив виртуальный метод, сохранив при этом возможность вызывать базовую реализацию по своему усмотрению. , ИМХО, C # должен был иметь явную реализацию интерфейса для создания виртуального метода с CLS-совместимым именем, поэтому кто-то, пишущий на C #, является производным от класса, который явно реализовал IFoo.Bar
, мог бы сказать override void IFoo.Bar
, а кто-то, пишущий на каком-то другом языке можно сказать, например Overrides Sub Explicit_IFoo_Bar()
; поскольку любой производный класс может повторно реализовать IFoo.Bar
, и поскольку любой производный класс, который не реализует IFoo.Bar
, может вызывать его сам по себе, я не вижу никакой полезной цели запечатывания явной реализации .
Между прочим, в vb.net обычным шаблоном будет просто Protected Overridable Sub IFoo_Bar() Implements IFoo.Bar
, без необходимости отдельного виртуального метода.