2012-05-08 1 views
1

クラスAとクラスBをクラスCに継承したいとします(ここではBも同様にAを拡張しています)。私はJavaで直接行うことはできませんが、ミックスイン継承(リンク:http://csis.pace.edu/~bergin/patterns/multipleinheritance.html)、これは基本クラスとして1つのインタフェースと他のものを使用し、内部的に委任を使用していますが、A & Bは無関係のクラスである。最初の2つがすでにベース - 子クラスの関係にあるときに、3つ目のクラスで2つのクラスを継承する方法はありますか?

& Bは、親子それらの自己を持っている、と私はCでそれらの両方を継承する必要があるとき、私は同じ方法をお教えください。

ちょうどあなたの情報のため、私がしようとしていますクラスで不変性を達成するために同じことをするA & B.

+1

待ち時間、何ですか?私は、AがBを伸ばしているのか、AがDを伸ばしているのかBを伸ばしているのかは分かりません。いずれにしても、複数のクラスを拡張することはできません - 1つのクラスと複数のインタフェースのみを拡張できます。 –

+0

@ルイスありがとうございます。私も前に言ったように、私は1つ以上のクラスを拡張することはできません。しかし、もし私が絶対にそれをやる必要があれば、これに対するプログラミングの回避策は何か(もしあれば)? – vmishra

+0

本当に何もありません。 'C 'に' A'と 'B' _fields_を持たせ、関係を「is-a」から「has-a」に切り替えることができるかもしれませんが、それ以外は?基本的には何もできません。 –

答えて

1

class Bは既にclass Aに拡張されており、class Cclass Bに既に拡張されています。

class A 
{ 
    public string hello() 
    { 
     return "Hello, World!"; 
    } 
} 

class B extends A 
{ 
} 

class C extends B 
{ 
} 

C foo = new C(); 
foo->hello(); // "Hello World!" because it is defined in A 
+0

あなたが与えたロジックは簡単ではありませんが、CLASS AとCLASS Bを不変であるようにしようとしていることを理解する必要がありますが、私が不変性を達成しようとしているとき、 AまたはBのデータメンバーに何も直接設定しない。 – vmishra

+1

その場合、 'C'のコンストラクタで作成される' A'と 'B'の(不変のバージョン)が必要で、' C'のプライベートフィールドに割り当てられます。多くの配管と決して(直接) Cの公開APIからの参照。私はJavaで手作業で必要とするすべてのロジックを手動で委譲する以外の方法は知らない。私は、PHPの魔法のような何かを信じていない__getと__callはjavaに存在します。 – Kris

+0

ええ、それは私が不変のもののためにやっているべきことだと思います、私は同じように他のエレガントな方法はありません。ありがとうクリス! – vmishra

0

は、なぜあなたは、クラスAに抽象クラスを作成し、その後はありません:class Bを拡張することにより、あなたはまた、おそらくあなたがで終わるだろう、具体的class B

で上書きされていないclass Aからのすべての機能を取得しますBとCでそれを拡張してください。あなたの一般的なメソッドを抽象として(あるいは定義することができる)Aの中に置いてください。そして、それらを具体的なクラスでオーバーライドすることができます。

+0

ええ、それは良い点ですが、問題は、すでに長い時間使用されている既存のクラスAを持っていて、複数のサブクラスがあるため、同じものを変更すると多くのことに影響します。しかし、とにかくありがとう! – vmishra