2010-03-10 10 views
7

Recentemente ho riscontrato una situazione in un codice su cui sto lavorando che non ha senso per me. Un insieme di classi eredita da una classe base puramente per condividere alcuni metodi nella classe base. Non esiste alcun metodo che ignori, solo le classi figlio che chiamano i metodi dalla classe genitore.Utilizzo dell'eredità puramente per condividere le funzionalità comuni

Mi sembra che questo sarebbe meglio modellato facendo in modo che le classi figlie facciano riferimento alla classe genitrice piuttosto che ereditandole, cosa che penso ridurrebbe la complessità non necessaria. È ragionevole, o mi sto perdendo qualche beneficio nell'usare un'eredità come questa?

+2

Sei corretto. –

risposta

3

Se i metodi della classe genitore ci sono puramente come "utilities" allora sì, sono d'accordo.

La domanda (almeno per me) sarebbe se la classe genitore potesse essere modificata in futuro per avere beneficio. Significato, qual è la relazione attuale logicamente? Se è un "è un" tra figlio e genitore, allora lascia. Se il genitore è solo una raccolta di metodi, rifattore di una classe di utilità o uso della delega.

3

Sei corretto. Purtroppo l'ereditarietà viene usata molto quando non è effettivamente necessaria.

Se non c'è, una relazione tra il figlio e la classe padre, l'ereditarietà non deve essere utilizzata.

0

Posso supporre che l'eredità che è possibile osservare sia solo il risultato del refactoring.

+0

Non è il miglior tipo di refactoring, dal momento che non aumenta la leggibilità ;-) – gruszczy

+0

In ogni caso è molto meglio del codice copia/incollato che era prima di questo refactoring. – Roman

3

L'ereditarietà può essere utilizzata (e abusata!) In diversi modi. Ecco le tre grandi categorie.

gerarchia concettuale:

classi concettualmente correlati possono essere organizzati in una specializzazione gerarchia:

  • persone, dipendenti, dirigenti oggetti
  • geometriche ...

Polimorfismo:

oggetti distinti, ma collegati classi possono essere trattate uniformemente di clienti

  • array di oggetti geometrici

Software riutilizzo:

Le classi correlate possono condividere interfacce, strutture dati o comportamento .

  • oggetti geometrici ...

Per uno studio completo delle diverse forme di eredità, leggere On the notion of inheritance.

Il caso che si menziona, è riutilizzo software. Non esiste una relazione -a, al massimo una relazione ha un rapporto. L'obiettivo è principalmente quello di riutilizzare lo stesso codice.

Come suggerito, questo può essere refactored con delega o anche in una classe di utilità è il metodo sono essenzialmente statici.

Problemi correlati