Overriding, virtual and new keyword

Partons du principe que vous n’êtes pas sans savoir les effets du mot-clé new sur le polymorphisme et le fait que vous « castiez » un objet dans un type ou dans un autre. Aujourd’hui, je vais vous montrer un exemple de mauvaise implémentation mais qu’il peut être intéressant de connaître (si on est masochiste) car ses effets sont déroutants.

aspnet

Voici l’implémentation en question:

implementation

Le problème provient de l’utilisation du mot-clé new dans la première redéfinition car il va « masquer » l’implémentation de la classe parente dans les instances dérivées. Le bon sens eut voulu qu’on utilise le mot clé override dans la dérivée ImplemB.

Voici le code d’utilisation de cette implémentation:

utilisation1

Et voici le résultat de l’utilisation:

resultat

On a donc créé un monstre:

  • en castant ImplemC en ImplemB, on obtient toujours bien la redéfinition implémentée dans ImplemC. Normal.
  • Mais en castant ImplemC en ImplemA, on obtient la définition initiale de ImplemA. le mot-clé new a créé une « barrière » entre la redéfinition par ImplemC et la définition initiale de ImplemA, qui elle, n’est pas redéfinie. Finalement, ce comportement est bien lui aussi normal mais dans cette implémentation finale, il est aussi dangereux!

A ne pas utiliser donc!

PS: autre cas moisi obtenu grâce au mot-clé « new »

argh

On a magnifiquement outrepassé la protection que le premier développeur de notre ImplemA avait choisie. Lorsque notre troisième développeur (on considère que chaque implémentation a été ajoutée par un développeur différent) vient coder ImplemC, il override proprement la méthode virtuelle de ImplemB sans se rendre compte qu’il continue le pêché du deuxième développeur… et on continue de trouer notre logiciel gaiement.

Advertisements

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s