contravariant argument types: wanna?

Jeremie Pelletier jeremiep at gmail.com
Wed Sep 23 07:06:11 PDT 2009


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.



More information about the Digitalmars-d mailing list