== Quote from Andrei Alexandrescu ([email protected])'s article > 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
If I understand covariance and contravariance right, this seems like a no-brainer and probably easy to implement if you already have a working familiarity with the DMD codebase. What would there be to the implementation besides: 1. Making the compiler accept class hierarchies for which contravariant arguments are declared, and 2. Inserting the necessary implicit upcasts.
