L'héritage multiple est excellent, et Perl le gère très bien tant que vous avez une compréhension claire de votre hiérarchie d'héritage et de certains des pièges potentiels (tels que ceux décrits dans perldoc perltoot). Pourtant, il ne traite pas de l'interdiction d'utiliser le pragma fields avec l'héritage multiple. En effet, je ne trouve aucune documentation sur ce que ce soit ...Pourquoi les champs pragma sont-ils incompatibles avec l'héritage multiple en Perl?
est ici une illustration:
package Parent1;
use fields 'field1';
package Parent2;
use fields 'field2';
package Child;
use base qw(Parent1 Parent2);
Cela échoue avec l'erreur: « ne peut pas hériter des champs à plurisubstitués ... »
Cela ne fonctionne pas même lorsque les deux parents ont les mêmes champs .. même quand ils sont prouvablement les mêmes, parce qu'ils viennent d'un grand-parent commun:
package Grandparent;
use fields qw(field1);
package Parent1;
use base 'Grandparent';
package Parent2;
use base 'Grandparent';
package Child;
use base qw(Parent1 Parent2);
Un inconvénient pour implémenter cela correctement est l'invariant que l'index d'un champ dans un objet enfant est toujours le même que l'index dans son parent. Je ne suis pas sûr que cette exigence soit vraiment nécessaire, cependant ... Contrairement à C++, où un objet peut être accédé en utilisant un pointeur typé à un parent, Perl connaît toujours le type réel d'un objet en opérant sur sa référence (en effet champs pseudohash est essentiellement un vtable, conservé sur chaque instance d'objet). Et en particulier dans le deuxième exemple ci-dessus, les champs hérités de chaque parent proviennent de les deux parents, donc ils peuvent être repliés ensemble et il n'y a pas d'index conflictuel.
Je suis sûr qu'il y a d'autres problèmes aussi, mais je ne les ai pas encore trouvés.
Quelqu'un peut-il avoir des connaissances sur les internes de Perl?
Vous ne pouvez pas avoir deux parents, et utilisez 'fields', vous devez trouver un autre paquet sur CPAN –
Um, merci ... ce n'était pas tout le point de mon message? – Ether
@Ether - pourquoi pas de réponse acceptée? Thx :) – DVK