2013-03-15 12 views
6

私はJavaが複数の継承をサポートしていないことを知っています。私はちょうど私の問題の回避策があるかどうかを知りたい。複数のクラスを拡張する

私はクラスCustomActionを持っています。このクラスは、2つの抽象クラス、すなわちBaseActionQuoteBaseActionを拡張する必要があります。私はこれらの抽象クラスを変更することはできませんし、他の拡張することができます。

これらの抽象クラスには、私が利用する必要があるメソッド実装があります。私は、インターフェイスが別のインターフェイスだけを拡張することもできるので、インターフェイスを作成することはできません。

アイデア?

+4

はおそらく、構図パターンは、あなたに役立つかもしれない - http://en.wikipedia.org/wiki/Composite_pattern –

+0

をこれらのクラスは、任意のインターフェイスを実装していますか?それらのクラスを私たちに見せてもらえますか? –

+0

これらのabstarctクラスは、他のいくつかのクラスを実装しています。私はこれらの抽象クラスでメソッドの実装を利用する必要があります。 – jijo

答えて

3

ここに行く...

public class CustomAction extends BaseAction { 
    class Inner extends QuoteBaseAction { 

    } 
} 
+2

これは継承ではありません。QuoteBaseActionをCustomActionに置き換えることはできません。唯一の目的が既存のコードを再利用することである場合にのみ機能します。しかし、この場合、BaseActionから拡張する必要はなく、合成メカニズムを介して再利用できます。 – Roman

+0

CustomActionは2つの抽象クラス(要件)を拡張する必要があり、それが上記のコードの機能です。 Innerクラスのインスタンスを作成すると、両方のクラスのすべてのメソッド/機能が使用できます。 –

+1

いいえ、そうではありません。もう一度、継承はコードの再利用に関するものではありません。 CustomActionインスタンスをQuoteBaseActionを受け入れるメソッドに渡すことはできません。 – Roman

-1

Javaでは、抽象クラスが他の抽象クラスを拡張することができます。

5

Compositionは、あなたのクラスの一部としてあなたの抽象クラスのいずれかをgo.Makeする方法です。

public abstract class Abs1 { 
// 
} 
public abstract class Abs2 { 
// 
} 
public class Main extends Abs1 { 
Abs2 abs2 = ... 
//impl 
} 
+0

最後の部分は分かりませんでした。 "Abs2 abs2 = ..."。 Abs2は新しい演算子を使用して開始することはできません。オブジェクトabs2を使用してAbs2で実装されたメソッドを使用するにはどうすればよいですか? – jijo

+0

@jijoあなたはABs2でそれらのメソッドを実装する匿名クラスを使うことができます。 Abs2のようにabs2 = new Abs2(){// abs2のすべての抽象メソッドを実装} – PermGenError

0

最高の賭けは委任されるでしょう。これらのクラスがインタフェースを使用する場合は、両方のインタフェースを実装するか、そこで使用するインタフェースを作成して、呼び出しを委任するクラス内の各クラスのインスタンスを保持することができます。

1

いいえ、2つの抽象クラスから継承することはできません。 抽象クラスがインターフェイスを実装している場合は、この問題を回避できます。このケースでは、組成物と継承を置き換えることができます。

abstract class BaseAction implements Action { ... } 

abstract class QuoteBaseAction implements QuoteAction { ... } 

class CustomAction implements Action, QuoteAction { 

    private BaseAction baseAction; 
    private QuoteBaseAction quoteBaseAction; 

    public Bar methodFromAction() { 
     return baseAction.methodFromAction(); 
    } 

    public Foo methodFromQuoteAction() { 
     return quoteBaseAction.methodFromQuoteAction(); 
    } 
} 
関連する問題