usar - ¿Cada función abstracta es virtual en C#, en general?
usar metodos de una clase abstracta (5)
Creo que está viendo el problema desde un punto de vista "C ++" (sea cortés, evite las palabras clave necesarias, guarde las pulsaciones de teclas).
La filosofía de C # es que la intención del código debe ser clara al leer la fuente, y el compilador debe poder verificar esa intención tanto como sea posible.
Entonces, aunque hay muy poco en el MSIL generado entre un método abstracto y un método virtual (o para el caso, entre una clase abstracta y no abstracta, o entre un parámetro fuera y un parámetro ref), las palabras clave adicionales dígale algo a los programadores de mantenimiento y permita que el compilador verifique dos veces lo que está haciendo.
Estaba mirando la pregunta de desbordamiento de pila ¿ Cuál es la diferencia entre la función abstracta y la función virtual? , y me preguntaba si cada función abstracta debería considerarse una función virtual en C # o en general.
Estaba un poco desconcertado por las respuestas "debes anular / puedes anular" a esa pregunta. Al no ser un programador de C #, tiendo a pensar que las funciones abstractas son solo un concepto de tiempo de compilación, y que las funciones abstractas son funciones virtuales por definición, ya que debe proporcionar al menos una, pero puede proporcionar múltiples implementaciones más adelante en la jerarquía.
Las funciones virtuales también tienen una dimensión de tiempo de compilación, ya que no puede anular una función no virtual, pero son principalmente un concepto de tiempo de ejecución ya que es "solo" la selección de la implementación del método correcto en función del receptor real.
Sí lo es. Para prueba:
abstract class A {
public abstract void Foo();
}
class B : A {
public override void Foo()
{ /* must do */ }
}
class C : B {
public override void Foo()
{ /* can do */ }
}
Sí. De la sección 10.6.6 de la especificación C # 3.0 :
Cuando una declaración de método de instancia incluye un modificador abstracto, se dice que ese método es un método abstracto. Aunque un método abstracto es implícitamente también un método virtual, no puede tener el modificador virtual.
Sí.
Una declaración de propiedad abstracta especifica que los accesadores de la propiedad son virtuales, pero no proporciona una implementación real de los accesadores. ( MSDN )
Tiene que ser virtual (y Jon Skeet ya ha sacado la especificación para demostrar que lo es ), porque, dada una referencia a la clase base abstracta, debe invocarse la implementación de la clase derivada concreta. Por ejemplo, dada la jerarquía Animal clásica:
abstract class Animal{
public abstract void Speak();
}
class Cat : Animal{
public override void Speak(){Console.WriteLine("meow");}
}
class Dog : Animal{
public override void Speak(){Console.WriteLine("bark");}
}
Una función que toma un objeto Animal
y llama a su método Speak
no sabría a qué implementación llamar si la función no fuera virtual.
static void TalkToAnimal(Animal a){
Console.WriteLine("Hello, animal.");
a.Speak();
}
Sin embargo, tenga en cuenta que las implementaciones de interfaz no son virtuales por defecto. Debido a que una interfaz funciona de manera diferente a una clase, no es necesario un verdadero polimorfismo para encontrar la implementación de un método de interfaz.