Contravariance allows derived classes to return from a function any derived 
class of what the parent class returns. I have discovered that if you claim to 
return a derived class, you can still return the parent class. In the example 
below, A_Parser is returning Report[] from a function that claims to return 
A_Report[]. I'm thinking this is a bug, is there any reason it wouldn't be?

import std.stdio;

class A_Parser : Parser {
   Report[string] stuff;

   this() {
      stuff = ["hi": new A_Report("Bye")];
   }

   override A_Report get(string uuid) {
      return stuff[uuid];
   }
}

class A_Report : Report {
   string value;
   this(string val) {
      value = val;
   }

   void print() {
      writeln(value);
   }
}

abstract class Parser {
   abstract Report get(string);
}

class Report {
}

void main() {
   auto a = new A_Parser();

   a.get("hi").print;

}

Reply via email to