2013-03-15 29 views
6

So che Java non supporta l'ereditarietà multipla non consentendo di estendere più di una classe. Voglio solo sapere se c'è una soluzione alternativa per il mio problema.Estensione di più classi

Ho una classe denominata CustomAction che deve estendere due classi astratte, BaseAction e QuoteBaseAction. Non posso cambiare nessuna di queste classi astratte e farne estendere l'altra.

Queste classi astratte hanno implementazioni di metodo che è necessario utilizzare. Non riesco a creare un'interfaccia anche perché un'interfaccia può estendere solo un'altra interfaccia.

Qualche idea?

+4

Forse il modello Composizione potrebbe aiutare - http://en.wikipedia.org/wiki/Composite_pattern –

+0

fare quelle classi implementa alcuna interfaccia? Potresti mostrarci quelle lezioni? –

+0

Queste classi di abstarct implementano altre classi. Ho bisogno di utilizzare l'implementazione del metodo in queste classi astratte. – jijo

risposta

3

Qui si va ...

public class CustomAction extends BaseAction { 
    class Inner extends QuoteBaseAction { 

    } 
} 
+2

Non è un'eredità: non è possibile sostituire QuoteBaseAction con CustomAction. Funzionerà solo se l'unico obiettivo è riutilizzare il codice esistente. Ma in questo caso, non è necessario estendere da BaseAction, può essere riutilizzato tramite il meccanismo di composizione. – Roman

+0

CustomAction deve estendere due classi astratte (requisito) ed è ciò che fa il codice precedente. Si crea un'istanza della classe Inner e si hanno tutti i metodi/funzionalità di entrambe le classi. –

+1

No, non è così. Ancora una volta, l'ereditarietà non riguarda assolutamente il riutilizzo del codice. Non è possibile passare un'istanza CustomAction a un metodo che accetta QuoteBaseAction. – Roman

-1

In java è possibile che le classi astratte estendano altre classi astratte.

5

Composition è il modo per go.Make uno della classe astratta come parte della vostra classe.

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

Non ho capito l'ultima parte. "Abs2 abs2 = ...". Abs2 non può essere istallato utilizzando un nuovo operatore. Come posso utilizzare un metodo implementato in Abs2 utilizzando l'oggetto abs2? – jijo

+0

@jijo potresti usare una classe anonima che implementa quei metodi in ABs2. come Abs2 abs2 = new Abs2() {// implementa tutti quei metodi astratti in abs2} – PermGenError

0

La soluzione migliore è la delega. È possibile implementare entrambe le interfacce (se queste classi utilizzano un'interfaccia) o creare interfacce per utilizzarle e quindi contenere un'istanza di ogni classe all'interno della classe a cui si delegano le chiamate.

1

No, non è possibile ereditare da due classi astratte. È possibile aggirare il problema se le classi astratte implementano interfacce. In questo caso, è possibile sostituire l'ereditarietà con la composizione:

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