Andrei Alexandrescu wrote:
Jeremie Pelletier wrote:
Yigal Chripun wrote:
On 23/09/2009 03:07, Andrei Alexandrescu wrote:
Hello,


Today, overriding functions have covariant return types:

class A {
A clone();
}

class B : A {
B clone(); // fine, overrides A.clone
}

That is entirely principled and cool. Now the entire story is that
overriding function may have not only covariant return types, but also
contravariant argument types:

class A {
A fun(B);
}

class B : A {
B fun(A); // fine (in theory), overrides A.fun
}

Today D does not support contravariant arguments, but Walter told me
once he'd be quite willing to implement them. It is definitely the right
thing to do, but Walter would want to see a compelling example before
getting to work.

Is there interest in contravariant argument types? If so, do you know of
a killer example?


Thanks,

Andrei

consider:

class Car { ... }
class Truck : Car { ... }

class Driver {
    void drive (Car c);
}

class truckDriver : Driver {
    void drive(Truck t); // NOT contra-variant !!
}

does the above design will be affected by your suggestion?

You just described covariant arguments, which is a feature i'd also like to see. It's different from contravariant arguments, implementing one does not give the other unfortunately.

Well there's a good reason for it: contravariant arguments are sound, covariant arguments aren't. My belief is that a design that would need a lot of argument covariance ought to be analyzed.

Have you read my other post in this thread where I show an actual example of covariant arguments from my display interface, my I/O interfaces also use covariant arguments although they're more friendly to generic interface parameters.

The point is, you see covariance all the time in interface programming when implementations expect an interface argument to be an object from that same implementation. As soon as you use an abstract factory to let the world use some implementation without being aware of which one it is, you're bound to see covariance at some point. Most people just code it explicitly, the mozilla code is *full* of explicit covariant interface requests.

While they may not be sound, its still a scenario you're gonna come across sooner or later, and a scenario which involves lots of similar boilerplate that can easily be generated by the compiler.

Jeremie

Reply via email to