複数継承は素晴らしいですし、継承階層といくつかの落とし穴(例えばperldoc perltootに記載されている落とし穴)を明確に理解している限り、Perlはそれをうまく処理します。しかし、複数の継承を持つプラグマfieldsを使用することの禁止については言及していません。確かに、私は全くこのことについて何のドキュメントを見つけることができません...ここでなぜフィールドプラグマはPerlで複数の継承と互換性がありませんか?
はイラストです:
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は参照で操作するときにオブジェクトの実際の型を常に知っていますフィールド擬似ハッシュは本質的にvtableであり、単一のオブジェクトインスタンスごとに保持されます)。上記の2番目の例では、特に、各親から継承されたフィールドはの両方ともの親から来ているので、それらは一緒に折り畳むことができ、矛盾するインデックスはありません。
他にも問題があると確信していますが、まだ見つかりませんでした。
これについてPerlの内部についての知識がある人は誰でもコメントできますか?
あなたは2つの親を持つことはできませんし、 'fields'を使って、CPAN –
で他のパッケージを見つけなければなりません。ありがとうございました。 – Ether
@Ether - なぜ受け入れられない答えですか? Thx :) – DVK