C ++: Evitare dual manutenzione in gerarchie di ereditarietà
-
23-09-2019 - |
Domanda
Quando si crea una struttura di ereditarietà C ++, è necessario definire le funzioni membro esattamente lo stesso in più luoghi:
Se B è una classe base astratta, e D, E, F e tutte ereditare da B, potrebbe essere questo:
class B
{
virtual func A( ... params ) = 0;
};
class D : public B
{
func A( ... params );
};
/* ... etc... similar implementations for E and F */
Quindi, non v'è, ovviamente, alcuni doppioni qui. Se l'interfaccia di B è di grandi dimensioni, si può avere molti luoghi per cambiare se l'interfaccia ha bisogno di cambiare.
Un collega ha suggerito alcuni trucchi con una incorporati #includes abilmente creati, ala:
class D: public B
{
#include "B_Interface.h" // B_Interface.h is a specially crafted .h file
}
Questo sembra un po kludgy? È? C'è una soluzione migliore per evitare il doppio di manutenzione?
Inoltre, forse la soluzione è in realtà gli strumenti migliori per supportare il linguaggio, come Visual Assist X?
Modifica:. Si assuma le classi derivate devono avere implementazioni uniche
Soluzione
In realtà, il problema più grande con la modifica di un'interfaccia di solito è tutto il codice che utilizza , non il codice che lo implementa. Se è facile da cambiare per il realizzatore, sarebbe probabilmente rendere la vita più difficile per gli utenti.
Altri suggerimenti
Questo è doloroso per cambiare un'interfaccia ampiamente utilizzato non è un bug; si tratta di una caratteristica.
Inoltre, forse la soluzione è in realtà gli strumenti migliori per supportare il linguaggio, come Visual Assist X?
Esattamente. Cambiando metodo di firme è un tasto funzione degli strumenti di refactoring.
Se si dispone per la loro attuazione più e più volte con un certo comportamento predefinito allora forse dovrebbero essere solo virtuali, e non virtuale pura.
Invece di usare il preprocessore per un altro modo, non dovrebbe essere usato Mi piacerebbe provare il mio editore (o IDE, se è questo quello che vuoi.)