Нет, вы не можете добиться того же, переопределив:
- Указание нового метода позволяет изменять тип возвращаемого значения
- Вызов базыМетод не может быть неправильным
Один пример сценария:
- Вы используете стороннюю библиотеку Foo, которая содержит класс FooBase
- Вы пишете свой собственный подкласс Foo, Bar
- Вы вводите публичный метод в Bar под названием DoSomething
- В следующей версии Foo третья сторона представляет метод DoSomething в Foo, которыйне делает то же самое, что ваш метод.Это может быть или не быть виртуальным.
На этом этапе вы хотите, чтобы весь ваш существующий код вызывал Bar.DoSomething, чтобы все еще вызывал Bar.DoSomething,но весь код, который вызывает Foo.DoSomething, должен по-прежнему вызывать эту реализацию - эти вызывающие стороны могут даже не знать о вашем методе, и они могут быть в сторонней сборке.
В долгосрочной перспективеВ этом случае вы, возможно, захотите переименовать свой метод, если сможете (в зависимости от степени контроля над вызывающими объектами), но в краткосрочной перспективе, если ваш метод как new
достигнет именно того поведения, которое вы хотите.
Такие вещи иногда называют проблемой хрупкого базового класса .Эрик Липперт написал об этом достаточно много, в том числе этот пост еще в 2004 году .