Ultimamente mi preoccupo dell'uso di classi astratte.
A volte una classe astratta viene creata in anticipo e funziona come un modello di come funzionano le classi derivate. Ciò significa, più o meno, che forniscono alcune funzionalità di alto livello ma lascia fuori determinati dettagli da implementare per classi derivate. La classe astratta definisce la necessità di questi dettagli mettendo in atto alcuni metodi astratti. In questi casi, una classe astratta funziona come un progetto, una descrizione di alto livello della funzionalità o qualsiasi altra cosa si voglia chiamare. Non può essere utilizzato da solo, ma deve essere specializzato per definire i dettagli che sono stati lasciati fuori dall'implementazione di alto livello.
Altre volte, accade che la classe astratta venga creata dopo la creazione di alcune classi "derivate" (poiché la classe genitore / astratto non è presente non sono ancora state derivate, ma tu sai cosa intendo). In questi casi, la classe astratta viene solitamente utilizzata come luogo in cui è possibile inserire qualsiasi tipo di codice comune che le classi derivate attuali contengano.
Avendo fatto le osservazioni di cui sopra, mi chiedo quale di questi due casi dovrebbe essere la regola. Qualunque tipo di dettagli dovrebbe essere gorgogliato nella classe astratta solo perché attualmente sono comuni in tutte le classi derivate? Dovrebbe esserci il codice comune che non fa parte di una funzionalità di alto livello?
Il codice che potrebbe non avere alcun significato per la classe astratta è lì solo perché è comune per le classi derivate?
Lasciatemi fare un esempio: la classe astratta A ha un metodo a () e un metodo astratto aq (). Il metodo aq (), in entrambe le classi derivate AB e AC, utilizza un metodo b (). Dovrebbe essere spostato b in A? Se sì, allora nel caso qualcuno guardasse solo A (facciamo finta che AB e AC non ci siano), l'esistenza di b () non avrebbe molto senso! È una cosa negativa? Qualcuno dovrebbe essere in grado di dare un'occhiata in una classe astratta e capire cosa sta succedendo senza visitare le classi derivate?
Per essere onesti, al momento di chiederlo, tendo a credere che scrivere una classe astratta che abbia senso senza dover cercare nelle classi derivate è una questione di codice pulito e architettura pulita. Ι non mi piace molto l'idea di una classe astratta che si comporta come un dump per ogni tipo di codice che sembra essere comune in tutte le classi derivate.
Che cosa pensi / fai pratica?