Нет, вы не можете переопределить не виртуальный метод. Самое близкое, что вы можете сделать, это скрыть метод, создав метод new
с тем же именем, но это не рекомендуется, так как оно нарушает хорошие принципы проектирования.
Но даже скрытие метода не даст вам времени выполнения полиморфной отправки вызовов методов, как вызов истинного виртуального метода. Рассмотрим следующий пример:
using System;
class Example
{
static void Main()
{
Foo f = new Foo();
f.M();
Foo b = new Bar();
b.M();
}
}
class Foo
{
public void M()
{
Console.WriteLine("Foo.M");
}
}
class Bar : Foo
{
public new void M()
{
Console.WriteLine("Bar.M");
}
}
В этом примере оба вызова к M
метода печати Foo.M
. Как вы можете видеть, этот подход позволяет вам иметь новую реализацию для метода, если ссылка на этот объект имеет правильный производный тип, но скрывает базовый метод делает ломает полиморфизм.
Я бы рекомендовал вам не скрывать базовые методы таким образом.
Я склоняюсь к тому, кто предпочитает поведение C# по умолчанию, что методы по умолчанию не являются виртуальными (в отличие от Java). Я бы пошел еще дальше и сказал, что классы также должны быть запечатаны по умолчанию. Наследование сложно правильно спроектировать, а тот факт, что существует метод, который не помечен как виртуальный, указывает на то, что автор этого метода никогда не предназначался для переопределения метода.
Edit: «Время выполнения полиморфные диспетчерский»:
То, что я имею в виду, это поведение по умолчанию, которое происходит во время выполнения при вызове виртуальных методов. Скажем, например, что в моем предыдущем примере кода вместо определения не виртуального метода я фактически определил виртуальный метод и истинный метод переопределения.
Если бы я назвать b.Foo
в этом случае CLR будет правильно определить тип объекта, что b
опорные точки как Bar
и будет направить вызов M
соответствующим образом.
Вы имеете в виду * overload * или * override *? Overload = добавить метод с тем же именем, но с разными параметрами (например, различные перегрузки Console.WriteLine). Override = (примерно) изменение поведения метода по умолчанию (например, метод Shape.Draw, который имеет другое поведение для Circle, Rectangle и т. Д.). Вы всегда можете * перегружать * метод в производном классе, но * переопределение * применяется только к виртуальным методам. – itowlson