Come condividere lo stesso comportamento in classi diverse?

3

Ho una classe chiamata Process , che è estesa da alcuni diversi tipi di processo chiamati ProcessA, ProcessB, ecc.

class Process{}

class ProcessA extends Process{}
class ProcessB extends Process{}
//...
class ProcessN extends Process{}

Esiste anche un'altra classe correlata ai dati di A, ma non al Processo. Lo chiamo TempA

Ora ProcessA ha un metodo chiamato calculate() , e TempA deve essere calcolato allo stesso modo di ProcessA . Poiché ProcessA estende Process (e Java non consente l'ereditarietà multipla), non posso creare una classe astratta come AbstractA e utilizzare il metodo calculate() per creare queste due classi ( ProcessA e TempA ) hanno lo stesso metodo di calcolo.

Quindi, come faccio a fare in modo che queste due classi abbiano lo stesso comportamento / metodo di calcolo senza copiare / incollare-duplicare i metodi?

    
posta Yasin Okumuş 10.05.2017 - 17:16
fonte

3 risposte

6

Favorisci la composizione sull'eredità. Se ProcessA e TempA hanno un comportamento comune, estrai tale comportamento in una classe separata e hai sia ProcessA che TempA contengono un membro di quella classe. Ciò vale anche da un punto di vista del test, in quanto significa che puoi testare unitamente il comportamento comune separatamente e (se necessario) deriderlo quando testare ProcessA e TempA .

    
risposta data 10.05.2017 - 17:41
fonte
5

Se due classi non correlate hanno lo stesso comportamento, probabilmente stai meglio estraendo questo comportamento su qualche classe esterna isolata.

Nei tempi antichi, ciò avveniva molto spesso nelle classi di utilità. Quasi tutti i progetti là fuori avevano una classe "Utils" o "Tools" che aveva un po 'di roba varia per le operazioni su stringhe, alcune cose di numeri e chissà cos'altro. Questo non era esattamente il modo migliore per farlo, ma ha funzionato bene.

Al giorno d'oggi è comune separare la logica e i comportamenti non banali su classi diverse, e li stanno componendo insieme per ottenere l'effetto desiderato. Questo può essere fatto in diverse forme di diversa complessità, con sapori diversi che si adattano a diverse esigenze. Ognuno di loro ha alcuni pro e contro, e alcuni di loro non sono così validi se stai pensando di cambiare materiale nel prossimo futuro, ma potresti:

  • Utilizzare una classe statica per fornire il comportamento necessario come metodo statico; (Veloce e semplice da fare, ma se il tuo metodo "Calcola" non è una funzione pura, evita questo.)
  • Crea una classe esterna con il comportamento necessario e rendi le classi che ne hanno bisogno istanzialo da solo; (buono, ma facile da interrompere se le modifiche sono necessarie in futuro)
  • Iniettare il comportamento necessario sul costruttore delle classi che ne hanno bisogno (manualmente o usando un framework di dipendenze per l'iniezione, se già lo si sta utilizzando). (Consiglio questo, personalmente. Non mi piacciono molto i framework DI ma, anche i DI fatti a mano possono fare un'enorme differenza).

e così via.

Non esiste un unico modo corretto per farlo a livello macro. Detto questo, la maggior parte delle soluzioni richiederà di isolare questo comportamento necessario da qualche altra parte, fuori da quelle classi, quindi hai un inizio!

Non copiare il codice copia-incolla!

    
risposta data 10.05.2017 - 18:47
fonte
-1

Now, ProcessA has a method called calculate(), TempA needs to be calculated in the same way as ProcessA as well.

Questo indica che ProcessA e TempA hanno dati uguali / simili.

So how do I make these two classes have the same calculation behaviour/method without copy/paste-duplication of methods?

Raccogli tutti i dati da ProcessA e TempA per il calcolo.
Utilizza una classe helper, chiamala Calculator , per eseguire il calcolo reale utilizzando i dati comuni di ProcessA e TempA .

    
risposta data 10.05.2017 - 17:28
fonte

Leggi altre domande sui tag