covariance, operator overloads, and interfaces
Steven Schveighoffer
schveiguy at yahoo.com
Tue May 11 07:32:54 PDT 2010
On Tue, 11 May 2010 09:33:38 -0400, Steven Schveighoffer
<schveiguy at yahoo.com> wrote:
> I don't know how to solve this without dropping interfaces, or repeating
> the template in all derived classes.
Here's an idea.
What if when using an auto return on a template, it becomes automatically
covariant for derived classes?
For example:
interface List
{
List append(List l);
auto opOpAssign(string op : "~=")(List rhs)
{
return append(l);
}
}
class ArrayList : List
{
ArrayList append(List l);
}
ArrayList al = new ArrayList;
ArrayList al2 = new ArrayList;
auto x = (al ~= al2);
when compiling the above line, the compiler should recognize that the
template returns auto. It does the calculation of what type to return
based on the context. In the context of ArrayList, append returns
ArrayList, so opOpAssign should return ArrayList.
Problems may arise if the compiler can easily determine the result when
dealing with straight interfaces, but cannot easily determine when dealing
with derived classes. I think in those cases, the compiler should just
output an error, and the user will be forced to concretely specify the
return type, or fix their method to be more covariant-friendly.
How does this sound?
I'd also like to see this for final interface functions as well.
-Steve
More information about the Digitalmars-d
mailing list