On ne peut pas parler de membres virtuels sans faire référence à polymorphisme . En effet, une fonction, une propriété, un indexeur ou un événement d'une classe de base marqué comme virtuel sera permet la surcharge d'une classe dérivée.
Par défaut, les membres d'une classe sont non virtuels et ne peut pas être marqué comme tel si les modificateurs static, abstract, private, ou override.
Exemple Considérons le ToString() méthode dans System.Object . Comme cette méthode est un membre de System.Object, elle est héritée par toutes les classes et fournira les méthodes ToString() à toutes ces classes.
namespace VirtualMembersArticle
{
public class Company
{
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
Company company = new Company() { Name = "Microsoft" };
Console.WriteLine($"{company.ToString()}");
Console.ReadLine();
}
}
}
La sortie du code précédent est :
VirtualMembersArticle.Company
Considérons que nous voulons changer le comportement standard des méthodes ToString() héritées de System.Object dans notre classe Company. Pour atteindre ce but, il suffit d'utiliser le mot clé override pour déclarer une autre implémentation de cette méthode.
public class Company
{
...
public override string ToString()
{
return $"Name: {this.Name}";
}
}
Désormais, lorsqu'une méthode virtuelle est invoquée, le run-time vérifie s'il existe un membre prioritaire dans la classe dérivée et l'appelle s'il est présent. Le résultat de notre application sera alors :
Name: Microsoft
En fait, si vous vérifiez la classe System.Object, vous constaterez que la méthode est marquée comme virtuelle.
namespace System
{
[NullableContextAttribute(2)]
public class Object
{
....
public virtual string? ToString();
....
}
}
10 votes
Voulez-vous comprendre l'objectif général du mot-clé "virtual" en C# ou comment il se rapporte spécifiquement à Entity Framework ?
4 votes
@M.Babcock : Je demande quel est le but en ce qui concerne les propriétés, car je n'ai jamais vu cela auparavant.
1 votes
Si vous êtes familier avec la façon dont le mot-clé virtual affecte le polymorphisme dans les méthodes, il en va de même pour les propriétés.
0 votes
Le but de votre question n'était-il pas de comprendre l'objectif général du mot-clé "virtual" en C# ?
1 votes
@M.Babcock : non, parce que je connais son utilisation avec les méthodes en ce sens qu'elle permet de remplacer la méthode. Je ne comprends pas pourquoi quelqu'un voudrait remplacer une propriété.
28 votes
@M.Babcock : comment aurais-je pu être plus clair ? La question s'intitule "Pourquoi utiliser 'virtual' pour les propriétés des classes".
2 votes
@Gary - Les propriétés getter / setter sont en fait compilées de manière statique dans les méthodes. Il ne s'agit donc pas de champs de classe traditionnels tels que "public virtual Dinner" ;