No, no puede anular un método no virtual. Lo más parecido que puede hacer es ocultar el método creando un método new
con el mismo nombre, pero esto no es aconsejable ya que rompe los buenos principios de diseño.
Pero incluso ocultar un método no le dará el tiempo de ejecución del envío polimórfico de llamadas a métodos como lo haría una verdadera llamada a un 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 las dos llamadas a la impresión M
Foo.M
método. Como puede ver, este enfoque le permite tener una nueva implementación para un método, siempre que la referencia a ese objeto sea del tipo derivado correcto, pero si se oculta un método base , se rompe el polimorfismo.
Recomendaría que no oculte los métodos base de esta manera.
Tiendo a lado con aquellos que favorecen el comportamiento predeterminado de C# que los métodos no son virtuales por defecto (a diferencia de Java). Yo iría más allá 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 anular el método.
Editar: "tiempo de ejecución de despacho polimórfica":
Lo que quiero decir con esto es el comportamiento por defecto que ocurre en tiempo de ejecución cuando se llama a los 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 reemplazado también.
Si tuviera que llamar b.Foo
en ese caso, el CLR sería determinar correctamente el tipo de objeto que los b
puntos de referencia a como Bar
y se enviará la llamada a M
apropiadamente.
¿Se refiere a * overload * or * override *? Sobrecarga = agregue un método con el mismo nombre pero diferentes parámetros (por ejemplo, diferentes sobrecargas de Console.WriteLine). Anular = (aproximadamente) cambiar el comportamiento predeterminado del método (por ejemplo, un método Shape.Draw que tiene un comportamiento diferente para Circle, Rectangle, etc.). Siempre puede * sobrecargar * un método en una clase derivada, pero * anulación * solo se aplica a métodos virtuales. – itowlson