22 votes

Chaque fonction abstraite est-elle virtuelle en C#, en général ?

Je regardais la question de Stack Overflow Quelle est la différence entre une fonction abstraite et une fonction virtuelle ? Je me demandais si chaque fonction abstraite devait être considérée comme une fonction virtuelle en C# ou en général ?

J'ai été un peu surpris par les réponses "vous devez remplacer ou vous pouvez remplacer" à cette question. N'étant pas un programmeur C#, j'ai tendance à penser que les fonctions abstraites ne sont qu'un concept de compilation, et que les fonctions abstraites sont des fonctions virtuelles par définition, puisque vous devez en fournir au moins une, mais que vous pouvez fournir plusieurs implémentations plus bas dans la hiérarchie.

Les fonctions virtuelles ont également une dimension au moment de la compilation, dans la mesure où vous ne pouvez pas remplacer une fonction non virtuelle, mais elles sont surtout un concept au moment de l'exécution, puisqu'il s'agit "simplement" de sélectionner l'implémentation correcte de la méthode en fonction du récepteur réel.

49voto

Jon Skeet Points 692016

Oui. D'après la section 10.6.6 de la C# 3.0 spec :

Lorsqu'une déclaration de méthode d'instance inclut un modificateur d'abstraction, cette est dite méthode abstraite abstraite. Bien qu'une méthode abstraite soit implicitement aussi une méthode virtuelle, elle ne peut pas avoir le modificateur virtual.

2voto

Marc Gravell Points 482669

Oui, c'est ça. Pour preuve :

abstract class A {
    public abstract void Foo();
}
class B : A {
    public override void Foo()
    { /* must do */ }
}
class C : B {
    public override void Foo()
    { /* can do */ }
}

1voto

Eduardo Crimi Points 777

Oui.

Une déclaration de propriété abstraite précise que les accesseurs de la propriété sont virtuels, mais ne fournit pas d'implémentation réelle des accesseurs. ( MSDN )

0voto

James Curran Points 55356

Je pense que vous envisagez le problème d'un point de vue "C++" (être laconique, éviter les mots-clés nécessaires, économiser les frappes).

La philosophie du C# est que l'intention du code doit être claire à la lecture de la source, et que le compilateur doit être capable de vérifier cette intention autant que possible.

Ainsi, bien qu'il y ait très peu de différence dans le MSIL généré entre une méthode abstraite et une méthode virtuelle (ou d'ailleurs entre une classe abstraite et une classe non abstraite ; ou entre un paramètre out et un paramètre ref), les mots-clés supplémentaires indiquent quelque chose aux programmeurs de maintenance, et permettent au compilateur de vérifier deux fois ce que vous faites.

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