4

私が次のものを持っているとしましょう:

type blah is abstract tagged 
record 
element1 : integer; 
end record;

type blah2 is abstract tagged
record
element2 : integer;
end record;

私は次のようなことができる可能性があることを望んでいます:

type blah3 is abstract new blah1 and blah 2 with null record;

したがって、理論的には、blah3.element1とblah3.element2にアクセスできるようになりました。

これは可能ですか?とヒントやヒントはありますか?

アップデート:

ポインターを使用してblah3の要素(blahとblah2を含む)を参照することは可能でしょうか?

IE(これは大まかなアイデアコードはひどいです... LOL)

type blah3 is new type with
record
element1 : ptr to blah.element1;
element2 : ptr to blah2.element2;
end record

そして、たとえばblah3.element1を介してアクセスできますか?

4

1 に答える 1

5

マークCは正しいです(いつものように)。

直接多重継承は、それをサポートする言語でも非常に物議を醸しています。両方の親クラスが同じメソッドまたはメンバーの異なるバージョンを定義する場合など、一部のエッジケースでコンパイラが実行することになっていることには大きな問題があります。彼らが継承を追加したとき、それはAda95で明示的に許可されていませんでした。

次の質問は「では、やりたいことをどうやってやるの?」です。

多重継承を使用して何を達成しようとしているかによって異なります。最悪の(最も複雑な)ケースでは、通常、「ミックスイン」継承で探している効果を達成できます。私以前にそれを行いましたが、それでもこのAdaICの記事で最もよく説明されていると思います:Ada95と多重継承は私が自分でできるよりも。

ダイジェストは次のとおりです。

Ada 95は、多重継承モジュールの包含(複数の「with」/「use」句による)、プライベート拡張とレコード構成による多重継承「is-implemented-using」、およびジェネリックの使用による多重継承ミックスインをサポートします。 、正式なパッケージ、およびアクセス識別。

Ada 2005にはこれを行う別の簡単な方法(「インターフェース」)があるようですが、私はまだそれを試す機会がありませんでした。あなたはそれについてもっと読むことができます(なぜ直接MIがまだエイダで悪いと考えられているのを含む) 。この例を見つけました。繰り返しますが、これはコンパイラがAda2005をサポートしている場合にのみ機能します

Interfaces can be composed from other interfaces thus 
type Int2 is interface;
...
type Int3 is interface and Int1;
...
type Int4 is interface and Int1 and Int2;
...
于 2010-03-03T20:08:04.853 に答える