И вот почему переопределение (и вообще любых виртуальных членов) - это то, что должно быть сделано очень осторожно ...
На самом деле, как правило, при переопределении вы должны пытаться кодировать как базовый класс, так и производный класс, чтобы реализация производного класса сначала вызывала базовую реализацию, а затем выполняла дополнительные функции ...
но этот принцип не применяется в ОО-языках и часто нарушается ...
Пример того, почему это плохо
Представьте, что вы разрабатываете CompanyA Тип (класс) Телефон
namespace CompanyA {
class Phone {
public void Dial() {
// do work to dial the phone here
}
}
}
No iagine Компания B не определяет другой тип BetterPhone, который использует телефон компании A в качестве базового типа ...
namespace CompanyB {
class BetterPhone: CompanyA.Phone {
public void Dial() {
Console.WriteLine("BetterPhoneDial");
EstablishConenction();
base.Dial();
}
}
}
Теперь CompanyA, чей класс Phone используется другими компаниями (компания C, D и т. Д.), Решает, что установление соединения полезно в классе, и изменяет CompanyA.Phone, добавляя EsatblishCOnnection (). метод, возможно, с другой реализацией ... Пока у нас не было ключевого слова "new", этот сценарий сломал бы класс BetterPhone CompanyB ... в первый раз, когда они попытались использовать новый базовый класс.