covariant final interface functions
Steven Schveighoffer
schveiguy at yahoo.com
Thu Mar 18 18:34:54 PDT 2010
I just ran into this idea when porting dcollections to D2.
I have the following interface:
interface Addable(V)
{
Addable add(V v);
Addable add(V v, out bool wasAdded);
}
In all cases, I have implemented add(V) as:
MyContainerType add(V v)
{
bool ignored;
return add(v, ignored);
}
I would like to make add(V) a final function in the interface, except for
one problem -- covariance. The reason I return 'this' when adding is so
you can chain together many operations. Because of covariance, this works
awesome because you always get back the type you are using.
But if I make add(V v) a final interface function, then MyContainerType
cannot override it, and things like this won't work:
myContainerType.add(5).myContainerTypeSpecialFunction();
Plus, even if you *could* override it (a la Andrei's overridable interface
methods), the implementation would be identical, so that's a lot of
mindless coding.
It would be nice to be able to flag a final interface function (or any
function for that matter) to indicate that it returns 'this', meaning it
should be covariant automatically without repeating the implementation. I
don't know if there's a way to do this so the compiler doesn't have to
actually generate another function to implement it in the derived class,
but even that would be OK. Even helping with the mindless recoding of the
same simple function would be great. It can also be another point of
documentation (I *know* this function returns the owner object because the
signature says so).
A proposed syntax:
final return this add(V v)
{
bool ignored;
add(v, ignored);
// no return necessary?
}
There's probably not a huge need for it, but I just thought I'd put the
idea out there.
-Steve
More information about the Digitalmars-d
mailing list