Ответ 1
Если вам нужен свежий метод в классе Derived, вы можете определить новый метод с новым именем в производном классе
Не всегда. Рассмотрим случай, когда вы получаете класс, который отображается в какой-либо другой библиотеке, тот, который у вас отсутствует. Вы добавляете некоторые методы в свой класс.
Позже разработчик библиотеки, на которой вы зависите, добавляет некоторые улучшения и использует то же имя, что и один из методов, добавленных в ваш производный класс. Скрытие в этом случае - это просто сохранение существующей функциональности. Если вы измените имя метода, вам необходимо обновить всю свою базу кода, и вы нарушите совместимость с тем, кто использует вашу библиотеку. Вместо этого вы можете скрыть свой существующий метод и сохранить совместимость с вашими иждивенцами и с той библиотекой, в которой вы будете зависеть в то же время.
Лично, случай, когда я использую метод, который больше всего скрывает, заключается в реализации операции клонирования для нескольких классов; без этой функции я не мог изменить тип возвращаемого значения, соответствующий типу класса:
class A
{
public A Clone()
{
return CloneImpl();
}
protected virtual A CloneImpl()
{
return MemberwiseClone();
}
}
class B : A
{
new public B Clone()
{
return (B)CloneImpl();
}
}
Защищенный виртуальный метод означает, что независимо от того, какой Clone()
вы вызываете, вы все равно возвращаете правильный тип объекта. Однако тип ссылки, которую вы получите, будет зависеть от того типа ссылки, который вы использовали для вызова Clone()
. Это позволяет:
B b = new B();
B b2 = b.Clone(); // Did not have to cast, thanks to the hiding method.
A a = b;
A a2 = a.Clone(); // Still returns a B, only typed as an A.