* Sto usando "Modulo" per indicare alcune estensioni di una classe, sia per ereditarietà che per composizione.
Supponiamo di avere una delle seguenti dichiarazioni di Entity :
using EUnit = int;
class Entity : /*With inheritance*/
Positional<EUnit> {
public:
Entity();
};
o
class Entity { /*With composition*/
Position<EUnit> pos; //Same as "Positional", but renamed
public:
Entity();
};
E la dichiarazione di Position / Positional :
template <class T>
class Positional {
T xPos;
T yPos;
public:
Positional();
Positional(T x, T y);
void moveTo(T x, T y);
void moveBy(T xOff, T yOff);
T getX() const;
T getY() const;
};
Che cosa succede se voglio creare una classe chiamata RandomWalk che può essere utilizzata per causare il Entity (o qualsiasi altra classe Positional ) per spostarsi casualmente in una posizione?
Seguendo il percorso di ereditarietà, ho pensato di ereditare RandomWalk da Positional in modo che abbia accesso a una posizione su cui agire. Se poi ho impostato Entity come:
class Entity :
Positional<EUnit>, virtual RandomWalk<EUnit> { ...
RandomWalk ora come l'accesso alla posizione di Entity , ma ha coinvolto "l'ereditarietà del diamante". Sto praticamente ereditando RandomWalk , quindi dovrebbe esistere solo una versione di Positional , ma l'ereditarietà multipla come questa sembra ancora disapprovata da ciò che ho letto.
Questo mi lascia con la composizione. L'unico modo in cui potevo pensare di dare a RandomWalk l'accesso alla posizione di Entity in questo modo era di fare qualcosa come passare un riferimento / puntatore al Entity Positional al costruttore RandomWalk . Usare i puntatori per qualcosa di simile sembra comunque eccessivo.
E ora sono fuori di idee e mi piacerebbe suggerimenti / consigli (o solo commenti generali sul problema).
So che potrei aggiungere direttamente una funzione randomWalk a Entity , ma la sto osservando nella prospettiva del riutilizzo.
E sì, RandomWalk è una specie di stupido caso d'uso, ma sono sicuro che questo problema (o uno simile) si verifica nel mondo reale.