Множественное наследование — это прекрасно, и Perl отлично с этим справляется, если у вас есть четкое представление о вашей иерархии наследования и некоторых потенциальных ловушках (например, описанных в perldoc perltoot). Однако в нем не обсуждается запрет на использование прагмы fields с множественным наследованием. Действительно, я не могу найти никаких документов об этом вообще...
Вот иллюстрация:
package Parent1;
use fields 'field1';
package Parent2;
use fields 'field2';
package Child;
use base qw(Parent1 Parent2);
Это не удается с ошибкой: «Невозможно умножить наследование полей в ...»
Это не работает, даже если оба родителя имеют одинаковые поля. даже когда они доказуемо одинаковы, потому что они происходят от общего дедушки и бабушки:
package Grandparent;
use fields qw(field1);
package Parent1;
use base 'Grandparent';
package Parent2;
use base 'Grandparent';
package Child;
use base qw(Parent1 Parent2);
Одной из ловушек для правильной реализации этого является то, что индекс поля в дочернем объекте всегда совпадает с индексом в его родительском объекте. Однако я не уверен, что это требование действительно необходимо... в отличие от C++, где к объекту можно получить доступ с помощью указателя, введенного в родитель, Perl всегда знает реальный тип объекта при работе с его ссылкой (действительно, fields псевдохеш — это, по сути, виртуальная таблица, хранящаяся в каждом отдельном экземпляре объекта). В частности, во втором приведенном выше примере поля, унаследованные от каждого родителя, поступают от обоих родителей, поэтому их можно складывать вместе и не возникает конфликтующих индексов.
Я уверен, что есть и другие проблемы, но я их еще не нашел.
Может ли кто-нибудь, кто хоть немного разбирается во внутреннем устройстве Perl, прокомментировать это?
fields
, вам нужно найти какой-то другой пакет на CPAN - person Brad Gilbert   schedule 23.07.2009