Maison  >  Article  >  développement back-end  >  La question de la classe de base fragile est-elle un mythe en cours ?

La question de la classe de base fragile est-elle un mythe en cours ?

DDD
DDDoriginal
2024-11-02 14:31:30291parcourir

Is the Fragile Base Class Issue a Myth in Go?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn