Какие сценарии имеет смысл использовать "метод скрытия"?

Возможный дубликат:
метод скрывается в С# с допустимым примером .why он реализован в рамках.? что является преимуществом в реальном мире.

Мне интересно, как метод ciding может быть полезен в С#? Если вы погружаетесь в концепцию, вы можете обнаружить, что скрытие метода - это что-то запутанное и приводит нас к стилю спагетти. Для этого есть несколько причин:

1- Если вам нужен свежий метод в классе Derived, вы можете определить новый метод с новым именем в производном классе.

2 - В полиморфном использовании, когда вы используете восходящий поток, ожидаемое поведение не будет достигнуто, и это может запутать.

(Специально это странное поведение может быть настолько очевидным и очевидным, если класс Base и Derived Class находятся в разных библиотеках, и вы хотите, чтобы их полиморфное использование было где-то в вашем коде)

class Base
{  
    public void Method() { Console.WriteLine("I am Base Class"); }
}
class Derived: Base
{
    public new void Method() { Console.WriteLine("I am Derived Class");}
}
class Program
{
    static void Main(string[] args)
    {
        Base C = new Derived();
        C.Method(); //output:"I am Base Class"
    }
}

Такое поведение может быть запутанным, но если мы использовали "virtual" в " Base" и "override" в " Derived" (я имею в виду полиморфное использование) выход был: "Я - Производный класс". и этот результат - то, что я думаю, что большинство из нас ожидало.

Другими словами, я считаю, что в иерархии большинство разработчиков ожидали переопределенных методов в методах производного класса Not New, которые хотят скрыть реализацию базового класса.

Я не могу понять, почему такая плохая вещь, которая не имеет никаких преимуществ в языке С#? по крайней мере, я хочу знать, какие лучшие методы метода скрываются в С#?

благодарим вас за помощь

Ответ 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.