Object oriented programming and interfaces
    Steven Schveighoffer 
    schveiguy at yahoo.com
       
    Tue Dec  5 17:19:18 UTC 2017
    
    
  
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
    
    
More information about the Digitalmars-d-learn
mailing list