В C#, явно реализующем интерфейс с использованием закрытого метода, который ничего не делает, кроме вызова защищенного виртуального метода, позволяет производным классам большую гибкость в отношении того, что они хотят делать с интерфейсом; методу должно быть присвоено имя другое, чем имя метода интерфейса (в приведенном выше примере это может быть DoSomething_Prot). Явная реализация интерфейса делает невозможным повторную реализацию производного класса для реализации базового класса, но если единственное, что делает реализация базового класса, - это привязка к защищенному виртуальному или абстрактному методу, нет необходимости в производном класса для повторной реализации интерфейса. Кроме того, даже если производный класс должен был повторно реализовать интерфейс либо намеренно, либо в результате ковариации, он все равно мог бы вызывать «кишки» реализации базового класса с использованием защищенного метода из базового класса.
Ввод всего кода для реализации интерфейса в виртуальном виртуальном методе, который неявно реализует интерфейс, лучше, чем перенос кода в явную реализацию, поскольку код производного класса может обычно связываться с частным членом. Однако такой подход требует, чтобы все производные классы публично реализовывали метод с одной и той же сигнатурой. Хотя это может показаться тем, чего, естественно, ожидать в любом случае, это не всегда. Например, в приведенном выше примере производный класс может пожелать, чтобы его метод DoSomething
возвращал тип, отличный от IEnumerable<object>
(например, он мог бы вернуть IList<Kangaroo>
). Метод, который реализует interfae, все равно должен будет возвращать точный тип IList<Kangaroo>
, но код, который знал, что он имеет дело с производным типом, может использовать возвращаемый тип как IList<Kangaroo>
без типизации. Если фактический код метода был в методе DoSomething_Prot()
, производный класс мог бы переопределить DoSomething_Prot
и объявить new public IList<Kangaroo> DoSomething()
. Если метод базового класса был вызван DoSomething()
, для производного класса не было бы способа переопределить его и определить новый метод с другим типом возвращаемого значения.
Непонятно, какой аспект примера вы путаете. –
Я предполагаю, что это явная реализация интерфейса с защищенной неявной реализацией (если это так, я бы сказал, что реализации неявного интерфейса являются общедоступными). –
Приношу свои извинения. Часть, которая меня смущает, - это то, что смотрит на меня как на частную реализацию IInterface.DoSomething, возвращающей виртуальную DoSomething. Я также обратил внимание на IInterface. требуется для его компиляции. – Kirby