In fact, the code contains a bug inside the A_Parser.get function which implicitely converts stuff from type Report to type A_Report. If you change the declaration of stuff to
        A_Report[string] stuff;
everything should be fine.

Furthermore, your comments seems to confuse the terms co- and contra-variance. The interface of of A_Parser.get does in fact demonstrate "co-variance": output types of overriding methods must be subtypes of the original methods output. (They have the same direction of inheritance as the enclosing class, hence "co-")

Input type, on the other hand are "contra-"variant. An overriding method must accept as input any *super*-type of input types of the original.

Greetings,
Norbert


On 26/07/10 17:46, Jesse Phillips wrote:
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