Compréhension approfondie de la différence entre les mots-clés "virtual override" et "new" dans les déclarations de méthode
Dans la programmation orientée objet, la substitution de méthode permet aux sous-classes de fournir leurs propres implémentations des méthodes définies dans leur classe parent. Cela permet la personnalisation et le polymorphisme du code. Cependant, il existe une différence subtile entre déclarer une méthode dans un type de base en combinaison avec les mots-clés « virtual » et « override » et utiliser le mot-clé « new » dans un sous-type.
« remplacement virtuel »
Quand une méthode déclarée dans un type de base est "virtuelle", cela signifie que ses sous-classes peuvent remplacer la méthode. Ainsi, lorsqu'une sous-classe remplace une méthode à l'aide du mot-clé "override", elle remplace en fait l'implémentation dans la classe de base.
«nouveau»
En revanche, lorsqu'une méthode déclarée dans une sous-classe est "nouvelle", elle crée une nouvelle méthode portant le même nom que la méthode de la classe de base. Une méthode de sous-classe ne remplace pas une méthode de classe de base ; elle fonctionne indépendamment.
Différences de comportement
La principale différence entre « remplacement virtuel » et « nouveau » réside dans leur impact sur le comportement d'exécution. Prenons l'exemple suivant :
<code class="language-csharp">public class BaseClass { public virtual bool DoSomething() { return false; } } public class DerivedClass : BaseClass { public override bool DoSomething() { return true; } } // ... BaseClass obj = new DerivedClass(); obj.DoSomething(); // 返回 true (重写后的实现)</code>
Si nous utilisons "new" au lieu de "override" dans DerivedClass
, cela entraînera une méthode différente masquant la méthode de la classe de base. Dans ce cas :
<code class="language-csharp">//... DerivedClass obj = new DerivedClass(); obj.DoSomething(); // 返回 false (基类实现)</code>
Héritage et polymorphisme
Lors de l'utilisation du "remplacement virtuel", les méthodes de sous-classe peuvent accéder et modifier l'implémentation fournie par la classe parent. Cela permet un héritage et un polymorphisme flexibles. Au lieu de cela, "new" remplace complètement la méthode de la classe de base, rompant ainsi la chaîne d'héritage.
Table de répartition virtuelle (VDT)
En C#, les méthodes virtuelles sont stockées dans une table de répartition virtuelle (VDT). Lorsqu'une méthode virtuelle est appelée, l'implémentation appropriée est déterminée en fonction du type de l'objet réel au moment de l'exécution. Cela rend le polymorphisme possible. Cependant, la « nouvelle » méthode n’est pas incluse dans le VDT, ce qui empêche la sélection dynamique de la méthode.
Conclusion
"virtual override" permet de remplacer les méthodes de la classe de base pour obtenir l'héritage et le polymorphisme, tandis que "new" crée des méthodes indépendantes dans les sous-classes. Comprendre la différence entre ces deux mots-clés est crucial pour remplacer efficacement les méthodes et concevoir un code orienté objet flexible.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!