ciao.
Sto leggendo il libro della gang of four e ho una domanda sull'abstract factory:
codice:
class MazeFactory {
public:
MazeFactory();
virtual Maze* MakeMaze() const
{ return new Maze; }
virtual Wall* MakeWall() const
{ return new Wall; }
virtual Room* MakeRoom(int n) const
{ return new Room(n); }
virtual Door* MakeDoor(Room* r1, Room* r2) const
{ return new Door(r1, r2); }
};
.
.
Maze* MazeGame::CreateMaze (MazeFactory& factory) {
Maze* aMaze = factory.MakeMaze();
Room* r1 = factory.MakeRoom(1);
Room* r2 = factory.MakeRoom(2);
Door* aDoor = factory.MakeDoor(r1, r2);
aMaze->AddRoom(r1);
adesso se voglio creare ad es una magic maze basta che creo una concrete factory ereditando da mazefactory cosi:
codice:
class EnchantedMazeFactory : public MazeFactory {
public:
EnchantedMazeFactory();
virtual Room* MakeRoom(int n) const
{ return new EnchantedRoom(n, CastSpell()); }
virtual Door* MakeDoor(Room* r1, Room* r2) const
{ return new DoorNeedingSpell(r1, r2); }
protected:
Spell* CastSpell() const;
};
e da programma:
codice:
MazeGame game;
EnchantedMazeFactory factory;
game.CreateMaze(factory);
fin qui ho capito.
Il mio problema non riguarda tanto il pattern , ma l'uso delle classi. se ho ad es un enchanted room nel mio labirinto come faccio a sapere se è di tipo enchanted o normale e chiamare la funzione castspell di conseguenza(solo se è di tipo enchancted)?
Sono abituato ad usare il polimorfismo per questo , ma non riesco a capire come nell'esempio.
PEnso che la chaive sia in questa riga:
return new EnchantedRoom(n, CastSpell()); e nel concetto di downcasting che per altro non ho capito bene.