equivariant functions
Benji Smith
dlanguage at benjismith.net
Tue Oct 14 18:59:55 PDT 2008
Steven Schveighoffer wrote:
> class A : IClonable
> {
> typeof(this) clone() const { return new A();}
> }
>
> class B : A
> {
> }
>
> B b = new B;
> B x = b.clone();
>
> Oops, b.clone() really only returns A, so this should fail. The real
> signature in A should be:
No, b.clone() definitely returns an instance of B. It's purely
coincidental (from the caller's perspective) that B's implementation is
identical to that of A.
Though I always thought the correct implementation of ICloneable was
like this:
interface ICloneable(T) {
T clone();
}
A : ICloneable!(A) {
public A clone() { ... }
}
I really don't see what all the fuss is about with the equivariance
stuff, except that it introduces a lot of confusing rules to fix the
holes in the (already complex and confusing) const system.
Any other use case where equivariance might apply (other than the const
stuff) seems to already have a simple, straightforward solution using
either templates, interfaces, or plain old overloads.
--benji
More information about the Digitalmars-d
mailing list