c# - qué - que es una interfaz en programacion orientada a objetos
¿Por qué una propiedad heredada de una interfaz se vuelve virtual? (1)
Digamos que tengo una interfaz y dos clases, y una de las clases implementa esta interfaz:
interface IAAA
{
int F1 { get; set; }
}
class AAA1
{
public int F1 { get; set; }
public int F2 { get; set; }
}
class AAA2 : IAAA
{
public int F1 { get; set; }
public int F2 { get; set; }
}
En la clase AAA2
, la propiedad F1
es ''heredada'' (no estoy seguro) de la interfaz IAAA
, luego uso la reflexión para verificar si una propiedad es virtual:
Console.WriteLine("AAA1 which does not implement IAAA");
foreach (var prop in typeof(AAA1).GetProperties())
{
var virtualOrNot = prop.GetGetMethod().IsVirtual ? "" : " not";
Console.WriteLine($@"{prop.Name} is{virtualOrNot} virtual");
}
Console.WriteLine("AAA2 which implements IAAA");
foreach (var prop in typeof(AAA2).GetProperties())
{
var virtualOrNot = prop.GetGetMethod().IsVirtual ? "" : " not";
Console.WriteLine($"{prop.Name} is{virtualOrNot} virtual");
}
La salida es:
AAA1 which does not implement IAAA
F1 is not virtual
F2 is not virtual
AAA2 which implements IAAA
F1 is virtual
F2 is not virtual
¿Alguna razón para esto?
A partir de la sección de comentarios de MS docs :
Un miembro virtual puede hacer referencia a los datos de instancia en una clase y debe ser referenciado a través de una instancia de la clase ... El tiempo de ejecución del lenguaje común requiere que todos los métodos que implementan miembros de la interfaz deben marcarse como virtuales; Por lo tanto, el compilador marca el método
virtual final
Si necesita determinar si este método es anulable, verificar IsVirtual
no es suficiente y también debe verificar que IsFinal
sea falso.
Aquí hay un método de extensión que realiza esta comprobación:
public static bool IsOverridable(this MethodInfo method)
=> method.IsVirtual && !method.IsFinal;