No, no puede anular un método no virtual. Lo más cercano que puede hacer es ocultar el método creando un new
método con el mismo nombre, pero esto no es recomendable ya que rompe los buenos principios de diseño.
Pero incluso ocultar un método no le dará tiempo de ejecución de envío polimórfico de llamadas de método como lo haría una verdadera llamada de método virtual. Considere este ejemplo:
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");
}
}
En este ejemplo, ambas llamadas al M
método print Foo.M
. Como se puede ver este enfoque permitirá tener una nueva implementación de un método siempre que la referencia a ese objeto es del tipo derivado correcta, pero que oculta un método de base hace polimorfismo descanso.
Le recomendaría que no oculte los métodos base de esta manera.
Tiendo a ponerme del lado de aquellos que favorecen el comportamiento predeterminado de C # de que los métodos no son virtuales por defecto (a diferencia de Java). Yo iría aún más lejos y diría que las clases también deberían estar selladas por defecto. La herencia es difícil de diseñar correctamente y el hecho de que haya un método que no esté marcado como virtual indica que el autor de ese método nunca tuvo la intención de que el método fuera anulado.
Editar: "envío polimórfico en tiempo de ejecución" :
Lo que quiero decir con esto es el comportamiento predeterminado que ocurre en el momento de la ejecución cuando llama a métodos virtuales. Digamos, por ejemplo, que en mi ejemplo de código anterior, en lugar de definir un método no virtual, de hecho definí un método virtual y un verdadero método anulado también.
Si b.Foo
tuviera que llamar en ese caso, el CLR determinaría correctamente el tipo de objeto al que b
apunta la referencia Bar
y enviaría la llamada de manera M
apropiada.