Since I started with OO I've been told switching on typeid is a big
no-no. E.g.
void Washer::wash( Vehicle myVehicle )
{
if( typeid(myVehicle) == typeid(Car) )
Washer::washCar( myVehicle );
else if( typeid(myVehicle) == typeid(Bike)
Washer::washBike( myVehicle );
else if( typeid(myVehicle) == typeid(Boat)
Washer::washBoat( myVehicle );
}
The alternative is the more correct Double Dispatch. E.g.
void Washer::wash( Vehicle myVehicle )
{
myVehicle.washer( this )
}
void Car::washer( Washer w )
{
w.washCar( this );
}
Now, consider we change Washer to XMLConverter and wash() to write().
This will still work, but when we want to go backwards and read XML and
write a Vehicle we need to switch on some kind of type id label anyway. E.g.
Vehicle XMLConverter::readVehicle( XMLdoc doc )
{
Vehicle v;
string s = doc.readAttr();
if( s == "Car" )
v = new Car();
else if( s == "Bike" )
v = new Bike();
else if( s == "Boat" )
v = new Boat();
return v;
}
So why not just give every MyObject a typeName() method and switch or
std::map<char*, fncPtron that throughout all dispatchers?
//Daniel