Diciamo che ho una classe java generica Filter<InputType, OutputType>
che riceve un oggetto di input e lo trasforma in un oggetto di output.
Ora ho due altre classi ( NoInputFilter<OutputType>
, NoOutputFilter<InputType>
) che dovrebbero fare lo stesso eccetto che non hanno un InputType
rispettivamente un OutputType
.
Ora le tre classi hanno alcune funzionalità in comune. La classe Filter
dovrebbe gestire l'oggetto di input nello stesso modo come fa NoOutputFilter
, e dovrebbe gestire l'oggetto di output nello stesso modo come fa NoInputFilter
.
Quindi ho qualcosa di simile in termini di funzionalità, dove B è Filter
:
Ora, Java non consente di ereditare da più classi. C'è un modello di progettazione per fare qualcosa di simile?
Il mio primo approccio era di avere due interfacce. Un'interfaccia per l'input, un'interfaccia per l'output. La classe Filter
implementa entrambi. Ma in questo modo devo implementare le interfacce due volte ciascuna.
Poi ho pensato di dare le istanze Filter
class (che implementa le due interfacce) di NoOutputFilter
e NoInputFilter
e basta chiamare il metodo giusto invece di avere il codice duplicato. Ma questo rompe la semantica, ha un sacco di codice standard, e non è un approccio molto pulito a mio parere. Ecco una piccola dimostrazione:
class Filter<InputType, OutputType> implements INoOutputFilter<InputType>, INoInputFilter<OutputType> {
private final INoOutputFilter<InputType> noOutputFilter;
private final INoInputFilter<OutputType> noInputFilter;
public void InputType setInput(InputType input) {
noOutputFilter.setInput(input);
}
public OutputType getOutput() {
noInputFilter.getOutput();
}
[...]
}
L'ultima idea era di abbassare la gerarchia delle classi sul sito:
public class Filter<InputType, OutputType>
public class NoInputFilter<OutputType> extends Filter <Void, OutputType>
public class NoOutputFilter<InputType> extends Filter <InputType, Void>
In questo modo, le classi si comportano nel modo giusto, nessun codice duplicato, ma ad es. NoOutputFilter ha un metodo public Void getOutput()
. Anche se non puoi creare un'istanza di qualcosa da Void
, l'API di queste due classi è sbagliata. Questo sarebbe qualcosa del genere:
Quindi questo non è un buon approccio.
Hai qualche suggerimento su come potrei risolvere questo in Java? C'è un modello di design per questo?