Polymorphisme d'héritage C#

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,

Je constate qu’il y a deux manière de faire du polymorphisme d’héritage en C# :

Méthode avec virtual et override :

1
2
3
4
5
6
7
class A {
   public virtual void methode() {}
}

class B : A {
   public override void methode() {}
}

Méthode avec new :

1
2
3
4
5
6
7
class A {
   public void methode() {}
}

class B : A {
   new public void methode() {}
}

D’après ce que j’ai pu lire, l’une cache la méthode parente et l’autre la surcharge, mais je ne comprend pas vraiment la différence. De plus, y-a-t’il une meilleur façon de faire ?

Merci

C’est au niveau de la création d’objet, dans le 1er cas, tu crées un objet en instanciant de cette manière,

1
2
A a = new B()
a.methode() // appelle la méthode de B

Pour le 2ème cas

1
2
A a = new B()
a.methode() // appelle la méthode de A

Il faut donc créer ton objet clairement de cette manière pour appeler la méthode de B.

1
2
B b = new B()
b.methode() // appelle la méthode de B

Sachant que le principe de l’héritage est de donner une similarité entre deux objets (B est un A), le 1er cas devrait être utilisé dans cette logique. L’autre cas, doit être un besoin spécifique…

Je comprends, donc la différence se fait sentir lors des conversions d’objets.

override écrase la méthode de A lors de la conversion B → A.

new permet simplement de masquer, ce qui veut dire que lors de la conversion B → A, la méthode de A reprend la main.

Est-ce bien cela ?

+0 -0

Lorsque l’on définit une fonction dans une classe dérivée qui a le même nom qu’une fonction de la classe de base, le comportement par défaut est un masquage.

En général, il n’y a pas vraiment de raison de vouloir masquer une fonction de la classe de base, et si on le fait, c’est souvent involontaire : le compilateur va donc se permettre de générer un warning qui nous prévient de notre erreur potentielle.

Le mot-clé new (si j’ai bien compris) permet d’indiquer explicitement au compilateur que l’on désire masquer la fonction de la classe mère. De cette manière, le compilateur de génère plus de warning.

Il y a trois notions, j’en reprends les définitions.

  • La surcharge (overload en VO): on a une nouvelle fonction de même nom, mais de signature (paramètres) différente, dans une même classe ou hors de classes. Lors des surcharges, il y coexistence de toutes les surcharges. Il existe un auteur et ses disciples qui emploient le terme "surdéfinition" au lieu de "surcharge". Je déteste cette traduction: elle ne veut rien dire en français, les autres termes ont le mérite d’être dans le dictionnaire.
  • Le masquage (hide): on a une nouvelle fonction de même nom, mais de signature (paramètres) éventuellement, mais non nécessairement, différente dans une classe fille. J’ai volontairement employé les même mots que précédemment, je tends à considérer le masquage comme une surcharge dégénérée. Comme l’a sous-entendu Olybri, le masquage est souvent une erreur. Dans les rares cas où c’est volontaire, j’apprends que C# a un moyen (le new) pour faire taire le compilateur. Beaucoup de cours OO en C++ présentent le masquage avant le concept qui est au coeur du polymorphisme d’inclusion (ou encore appelé d’héritage) : ....
  • La redéfinition (override en VO). Cette fois, nous avons dans la classe fille une fonction de même nom et surtout de même signature (même paramètres – à la contra-variance près dans les rares langages qui doivent le permettent, il parait qu’il en existe). Cette nouvelle définition, remplace/supplante (j’aime beaucoup "supplante"), ou écrase comme tu as dit, la définition au niveau parent. C’est cette notion qui est au coeur du polymorphisme d’inclusion.

Techniquement, c’est les mots clés employés et/ou autres détails propres aux langages, qui font que nous avons un masquage ou une redéfinition lorsque la fonction dans la classe fille a mêmes nom et paramètres. Ici: new VS override. Et je soupçonne que virtual joue aussi un rôle en C# comme c’est le cas en C++ (que je connais beaucoup mieux pour le coup).

Il est fréquent de voir des gens qui mélangent surcharge et redéfinition. Les concepts derrière ces termes sont bien différents. Le premier enrichi en offrant des alternatives directement (la surcharge est un des deux polymorphismes ad’hoc). Le second affine en supplantant un comportement par un autre plus spécialisé/ajusté. (Dans les films séries de SF, on entend régulièrement override quand les gars veulent court-circuiter en urgence un truc qui les empêche de faire ce qu’ils voudraient: généralement ils override procédures de sécurité)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte