Maison  >  Article  >  développement back-end  >  Compréhension de l'héritage multiple PHP

Compréhension de l'héritage multiple PHP

小云云
小云云original
2018-03-22 13:01:272170parcourir

L'héritage multiple PHP est très déroutant. L'ambiguïté et l'arbre d'héritage Diamond of Death sont petits aux deux extrémités et grands au milieu, utilisez donc des traits à la place (clair et clair, un code réutilisable est obtenu et la méthode plate est plus claire et résolue. Ambiguïté (quelle méthode doit être utilisée sinon une erreur sera signalée)

Hier soir, j'ai discuté avec G d'une question sur l'opportunité d'utiliser l'héritage multiple. À ce moment-là, j'étais fortement opposé. parce que l'héritage multiple m'a affecté extrêmement mal, je pense que c'est quelque chose qui devrait être méprisé. La raison principale est que je pense qu'il est très facile de provoquer toutes sortes de confusion, à la fois dans la programmation et dans la conception, mais je ne sais pas. beaucoup de choses sur ses spécificités. Je n'ai jamais utilisé l'héritage multiple auparavant. C'est à cause de l'examen que j'ai découvert cette chose et je l'ai jeté immédiatement après l'examen. Afin d'en savoir plus, je suis allé en ligne sur Baidu et j'ai trouvé. commentaires publics à ce sujet.Avantages : Ses avantages sont évidents, simples, clairs et plus propices à la réutilisation. Bien que l'héritage unique puisse également faciliter la réutilisation, il peut encore y avoir beaucoup de code en double. Si l'héritage multiple est utilisé, le code dupliqué sera utilisé. être considérablement réduit. Par exemple, l'Encyclopédie Baidu a mentionné un exemple selon lequel un chat peut hériter à la fois de la classe des mammifères et de la classe des dessins animés, de sorte qu'il n'est pas nécessaire de réécrire les propriétés et les méthodes de la classe des dessins animés. également évident.La première est l'ambiguïté.Quand il y a des méthodes avec le même nom dans deux classes de base, vous devez indiquer de quelle classe de base provient cette méthode lors de l'appel de la sous-classe, mais heureusement, le compilateur le rappellera. vous lorsque vous êtes confus. Deuxièmement : si la classe A dérive B et C, et que B et C dérivent conjointement D, et que des problèmes surgissent. Ce type d'arbre d'héritage a un nom frappant : arbre d'héritage de diamant (DOD : Diamond Of Death). . "Mort" est littéralement un très gros mot, et c'est vrai. A est la classe parente de D, mais il y a deux manières d'organiser les données, outre l'ambiguïté, pensez-y. combien de méthodes apparemment en double et combien de membres de données portant le même nom y a-t-il dans D ! "Évitez à tout prix l'apparition du DOD. À moins que vous ne pensiez qu'il est plus approprié que le DOD apparaisse ici, et assurez-vous que si vous utilisez des classes de base virtuelles (héritage virtuel), assurez-vous de bien connaître les détails de chaque classe et assurez-vous de connaître les effets secondaires des classes de base virtuelles (héritage virtuel). " Voici un autre vocabulaire, vtable (en C++, Je ne sais pas si PHP en a un, je ne l'ai pas trouvé sur Baidu, mais il devrait être là.) Vtable Chaque classe avec des fonctions virtuelles a une telle chose. Elle enregistre en fait les pointeurs de fonction de toutes les fonctions virtuelles. C'est-à-dire que c'est la position de départ du tableau de pointeurs de fonction. Par exemple, virtual void TheSecondFun() est enregistré dans le deuxième élément du tableau. Lorsqu'une instance d'objet de cette classe appelle TheSecondFun, le deuxième pointeur de fonction. est supprimé selon la relation correspondante.Pour exécuter la fonction, ce comportement est appelé liaison tardive, ce qui signifie que vous ne savez à quoi ressemble la fonction appelée qu'au moment de l'exécution, au lieu de la liaison anticipée qui est déterminée lors de la phase de compilation. L'héritage multiple peut également rendre les tables virtuelles des sous-classes inhabituelles. La table virtuelle à héritage unique ajoute simplement une nouvelle fonction virtuelle à la fin de la table virtuelle de classe parent, et la table virtuelle de l'objet de sous-classe contient la table virtuelle de classe parent ordonnée. Pour l'héritage multiple, les deux classes parentes peuvent avoir des vtables complètement différentes. Par conséquent, il est absolument impossible que la vtable de la sous-classe contienne les vtables complètes et ordonnées des deux classes parentes. La table virtuelle de la sous-classe peut contenir deux tables virtuelles de classe parent déconnectées, de sorte que chaque classe parent est obligée d'ajouter une table virtuelle, c'est-à-dire qu'un pointeur est ajouté à chaque objet de classe parent. L'héritage multiple pose également d'autres problèmes : utiliser des pointeurs de classe parent pour pointer vers des objets de sous-classe devient une question compliquée. Vous devez utiliser Dynamic_cast fourni en C++ pour effectuer la conversion. Quant à Dynamic_cast, c'est aussi un type gênant. Il convertit pendant l'exécution plutôt que pendant la compilation (car il ne peut pas déterminer vers quel type il veut convertir pendant la compilation. Par conséquent, en plus de provoquer de légères pertes de performances, il nécessite une compilation). Le compilateur autorise RTTI (Runtime Type Information, informations de type d'exécution), ce qui nécessite que le compilateur enregistre les informations d'exécution de toutes les classes. Pour résumer : dans la vraie vie, certaines choses ont souvent les attributs de deux ou plusieurs choses. Afin de résoudre ce problème, le concept d'héritage multiple est introduit. L'avantage de l'héritage multiple est qu'un objet peut appeler des interfaces dans plusieurs classes de base. L’inconvénient de l’héritage multiple est qu’il est sujet à une ambiguïté ascendante de l’héritage et augmente la complexité du programme. Suggestion : utilisez judicieusement l'héritage multiple. Utilisez l'héritage multiple judicieusement. La dernière chose : l'existence est raisonnable.

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