Steven Schveighoffer wrote:
On Wed, 23 Sep 2009 11:13:26 -0400, Andrei Alexandrescu
<[email protected]> wrote:
class AutoVehicle { ... }
class Car : AutoVehicle { ... }
class Truck : AutoVehicle { ... }
class Driver {
// A driver is licensed to drive a car
void drive(Car c);
}
class TruckDriver : Driver {
// A truck driver is licensed to drive a car...
override void drive(Car c);
// ... and a truck
void drive(Truck c);
// No contravariance needed yet
}
class JamesBond : Driver {
// James Bond can drive any auto vehicle
// Contravariance needed here
override void drive(AutoVehicle c) { ... }
}
Now if what you have is a JamesBond and a Truck, you need
contravariance to have him drive it. (A HotGirl may or may not be
present in the scene.)
Your example just triggered a possible problem with contravariance.
Consider this class:
class Bad : TruckDriver {
override void drive(AutoVehicle c) { ...}
}
What does this override, drive(Truck) or drive(Car), or both? What if
you didn't want to override both? My instinct is that this should be an
error, to keep things simple. But it might be very annoying for some
designs...
It should override both. It is already the case that one method
overrides several others (e.g. with multiple inheritance of interfaces).
Andrei