equivariant functions

Steven Schveighoffer schveiguy at yahoo.com
Tue Oct 14 19:19:50 PDT 2008


"Benji Smith" wrote
> 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.

B is definitely not the same as A.  B could have a different implementation, 
I just didn't give it one.

e.g.:

class A : IClonable
{
  typeof(this) clone() const { return new A(); }
  void foo() {writefln("This is A");}
}

class B : A
{
   void foo() {writefln("This is B");}
}

B b = new B;
b.clone().foo(); // prints "This is A"

It can't work any other way, or else the type system would be broken.

-Steve 





More information about the Digitalmars-d mailing list