При работе над обновлением я, оказалось, сталкивался с кодом как это.
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: Я понимаю, что явная реализация интерфейса очень важна, и это может использоваться, когда мы должны предоставить доступ к методу на интерфейсном уровне только, и использовать два интерфейса с той же подписью метода.
Ага. Выглядит излишне.
Вызов его через ссылку типа Customization и ссылку типа ICustomization приводит к одинаковому поведению. Если вы хотите, чтобы приведенные ниже вызовы вели себя по-другому, то явная реализация интерфейса имела бы смысл.
Customization oVar = new Customization();
oVar.GetColumnsDefinition(); // calls 1st method
ICustomization iVar = obj;
iVar.GetColumnsDefinition(); // calls 2nd method - explicit impl.
Вы должны удалить явную реализацию. Однако, если вы удалите другую реализацию, вы ограничите клиентов так, чтобы они больше не могли вызывать oVar.GetColumnsDefintion () - им пришлось бы использовать переменную интерфейса, как показано выше.
Для информации, в основном вы видите этот специфический паттерн, когда (любой из):
виртуальным
или абстрактным
, для подклассов, чтобы переопределить
публичного
метода не совсем такая же, например, публичный API имеет более специфический возвращаемый тип (обычный для таких вещей, как IEnumerable[]
или ICloneable
). public
, но мы хотим, чтобы он был легко вызываем внутри типа (без необходимости nop-cast)В этом случае он действительно выглядит избыточным.