Maison > Article > développement back-end > La question de la classe de base fragile est-elle un mythe en cours ?
Langage Go : problème de classe de base fragile - Un mythe démystifié ?
Dans la programmation orientée objet, le problème de la classe de base fragile se pose lors de l'héritage les classes sont affectées par les modifications apportées à la classe de base. Ce problème devient particulièrement évident lorsque la classe de base utilise des méthodes virtuelles.
Malgré l'utilisation répandue de la composition plutôt que de l'héritage dans Go, des inquiétudes persistent quant à l'existence possible d'un problème de classe de base fragile au sein du langage. Approfondissons ce sujet.
Le problème de la classe de base fragile expliqué
La fragilité survient lorsqu'une classe de base avec des méthodes virtuelles (méthodes remplaçables) est modifiée. Cela peut potentiellement casser les classes héritées si le comportement des méthodes modifiées dépend de l'existence de méthodes virtuelles.
Cependant, dans Go, le polymorphisme est absent. Lorsqu'un type est incorporé dans une structure, ses méthodes sont promues vers la structure wrapper, mais elles ne peuvent pas être remplacées. Cela signifie que les méthodes d'origine définies dans le type intégré seront toujours appelées.
Démonstrations en Java et Go
Pour illustrer le problème de la classe de base fragile en Java, considérons l'exemple suivant :
<code class="java">class Counter { void inc() { value++; } void incBy(int n) { value += n; } } class MyCounter extends Counter { @Override void inc() { incBy(1); } }</code>
Changer la méthode de la classe de base pour utiliser une boucle for pour une augmentation incrémentielle (incBy(int n)) entraînerait un dysfonctionnement de MyCounter en raison d'une boucle sans fin.
En revanche, dans Go, le code équivalent suivant ne rencontrera pas le même problème :
<code class="go">type Counter struct { value int } func (c *Counter) Inc() { c.value++ } func (c *Counter) IncBy(n int) { c.value += n } type MyCounter struct { Counter } func (m *MyCounter) Inc() { m.IncBy(1) }</code>
Même si la méthode de classe de base dans Go était modifiée en boucle for problématique, le type intégré ne serait pas affecté car il appelle la méthode originale définie dans la classe de base.
Conclusion
Bien que le problème traditionnel de la classe de base fragile soit une préoccupation dans des langages comme Java où des méthodes virtuelles sont présentes, elle est largement atténuée en Go du fait de l'absence de polymorphisme. L'absence de méthodes virtuelles garantit que les méthodes intégrées invoquent toujours l'implémentation d'origine définie dans la classe de base, évitant ainsi le problème de fragilité associé à l'héritage.
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!