2013-03-15 14 views
6

Ich weiß, dass Java die Mehrfachvererbung nicht unterstützt, indem es nicht erlaubt, mehr als eine Klasse zu erweitern. Ich möchte nur wissen, ob es eine Problemumgehung für mein Problem gibt.Mehrere Klassen erweitern

Ich habe eine Klasse mit dem Namen CustomAction, die zwei abstrakte Klassen, BaseAction und QuoteBaseAction erweitern muss. Ich kann keine dieser abstrakten Klassen ändern und andere erweitern.

Diese abstrakten Klassen haben Methodeimplementierungen, die ich verwenden muss. Ich kann auch keine Schnittstelle erstellen, da eine Schnittstelle nur eine andere Schnittstelle erweitern kann.

Irgendwelche Ideen?

+4

Vielleicht könnte die Zusammensetzung Muster, das Sie helfen - http://en.wikipedia.org/wiki/Composite_pattern –

+0

Sie diese Klassen jede Schnittstelle implementiert? Können Sie uns diese Klassen zeigen? –

+0

Diese abstarct-Klassen implementiert einige andere Klassen. Ich muss die Methodenimplementierung in diesen abstrakten Klassen verwenden. – jijo

Antwort

3

Hier gehen Sie ...

public class CustomAction extends BaseAction { 
    class Inner extends QuoteBaseAction { 

    } 
} 
+2

Es ist keine Vererbung: Sie können QuoteBaseAction nicht durch CustomAction ersetzen. Es funktioniert nur, wenn das einzige Ziel darin besteht, vorhandenen Code wiederzuverwenden. In diesem Fall ist es jedoch nicht notwendig, von BaseAction zu profitieren. Es kann über den Kompositionsmechanismus wiederverwendet werden. – Roman

+0

CustomAction muss zwei abstrakte Klassen (Anforderung) erweitern und das ist, was der obige Code tut. Sie erstellen eine Instanz der Inner-Klasse und verfügen über alle Methoden/Funktionen der beiden Klassen. –

+1

Nein, tut es nicht. Auch hier geht es bei Vererbung nicht um Code-Wiederverwendung. Sie können die CustomAction-Instanz nicht an eine Methode übergeben, die QuoteBaseAction akzeptiert. – Roman

-1

In Java ist es für abstrakte Klassen möglich, andere abstrakte Klassen zu erweitern.

5

Composition ist die Art und Weise einer Ihrer abstrakten Klasse als Teil Ihrer Klasse zu go.Make.

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

Ich habe den letzten Teil nicht verstanden. "Abs2 abs2 = ...". Abs2 kann nicht mit einem neuen Operator gestartet werden. Wie kann ich eine in Abs2 implementierte Methode mit dem Objekt abs2 nutzen? – jijo

+0

@jijo Sie könnten eine anonyme Klasse verwenden, die diese Methoden in ABs2 implementiert. wie Abs2 abs2 = new Abs2() {// implementiert all diese abstrakten Methoden in abs2} – PermGenError

0

Ihre beste Wette wäre Delegation. Sie können beide Schnittstellen implementieren (wenn diese Klassen eine Schnittstelle verwenden) oder Schnittstellen erstellen, um sie dort zu verwenden, und dann eine Instanz jeder Klasse in der Klasse halten, an die Sie Ihre Aufrufe delegieren.

1

Nein, Sie können nicht von zwei abstrakten Klassen erben. Sie können umgehen, wenn abstrakte Klassen Schnittstellen implementieren. In diesem Fall können Sie die Vererbung mit der Zusammensetzung ersetzen:

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(); 
    } 
}