On 12/4/17 3:43 PM, Dirk wrote:
Hi!
I defined an interface:
interface Medoid {
float distance( Medoid other );
uint id() const @property;
}
and a class implementing that interface:
class Item : Medoid {
float distance( Item i ) {...}
uint id() const @property {...}
}
The compiler says:
Error: class Item interface function 'float distance(Medoid other)' is
not implemented
Is there a way to implement the Item.distance() member function taking
any object whose class is Item?
You are thinking about covariance and contravariance.
In D, only the return value can work with covariance:
interface Medoid {
Medoid getIt();
}
class Item : Medoid {
Item getIt() { return this; }
}
D does not support contravariance on parameters. And in any case you
have it backwards. A derived override could take a base type, but not a
more specific type, for the reasons Adam outlined.
-Steve