una qué que programacion polimorfismo orientada objetos multiple interfaz interfaces herencia form ejercicios ejemplos derivada composicion clases clase abstracta c# reflection

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;