Qui è il mio caso:Prevenire metodo di scrittura clone per ogni sottoclasse
class A
{
public:
virtual A* clone() = 0;
};
class B : public A
{
virtual B* clone() override
{
return new B();
}
};
Nel mio codice ora il 100% del sublcasses di A
solo implementare il metodo clone
esattamente allo stesso modo solo per la classe D
Ho tipo di ritorno D
e creo l'oggetto di D
ovviamente.
Come posso evitare questa duplicazione? Quali schemi o trucchi possono aiutare?
Ho pensato di utilizzare CRTP pattern, ma utilizza i modelli e la mia funzione è virtuale. Come comprendiamo i modelli e le funzioni virtuali sono incompatibili.
NVI pattern non funziona, poiché il tipo di ritorno dei metodi di clonazione è diverso.
È possibile utilizzare CRTP, i modelli e le funzioni virtuali non sono incompatibili di per sé. –
Forse non puoi, non sono sicuro se puoi utilizzare l'ereditarietà per soddisfare le funzioni virtuali pure. Questo è ancora indipendente dai modelli però. Forse si può aggirare il problema non usando l'ereditarietà multipla, ma piuttosto usando una classe intermedia, cioè 'classe B: clonabile pubblico {...}' e 'modello classe clonabile: pubblico B {.. .} '. –
Qual è il tuo codice duplicato? La definizione dei metodi clone in ciascuna sottoclasse con solo la nuova chiamata T?O è un codice più grande nei metodi clone nel tuo vero progetto? Se è il secondo caso, puoi semplicemente avere una funzione template che clona un oggetto e chiama questa funzione template dai tuoi metodi clone. – Johnmph