42 votes

Pourquoi une propriété héritée d'une interface devient-elle virtuelle ?

Disons que j'ai une interface et deux classes, et que l'une des classes implémente cette interface :

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 classe AAA2 , propriété F1 est "héritée" (je n'en suis pas sûr) de l'interface IAAA Ensuite, j'utilise la réflexion pour vérifier si une propriété est virtuelle :

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");
}

Le résultat est le suivant :

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

Quelle en est la raison ?

36voto

vasily.sib Points 2417

À partir de Section des remarques des documents de MS :

Un membre virtuel peut faire référence à des données d'instance d'une classe et doit être référencé par l'intermédiaire d'une instance de la classe... Le moteur d'exécution du langage commun exige que toutes les méthodes qui implémentent des membres d'interface soient marquées comme virtuelles ; par conséquent, le compilateur marque la méthode virtual final

Si vous devez déterminer si cette méthode peut être remplacée, vous pouvez alors vérifier IsVirtual n'est pas suffisante et vous devez également vérifier que IsFinal est fausse.

Voici une méthode d'extension qui permet d'effectuer cette vérification :

public static bool IsOverridable(this MethodInfo method)
    => method.IsVirtual && !method.IsFinal;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X