[phobos] Issue with opEquals(Object, Object)

Steve Schveighoffer schveiguy at yahoo.com
Tue Apr 27 13:11:48 PDT 2010


No loss there.  Transitivity is already not enforced by the current system.

An example:

interface I1
{
   int getX();
}

interface I2
{
   int getX();
}

class C1 : I1
{
   int x;
   int getX() { return x; }
   bool opEquals(Object o)
   { if(auto n = cast(I1)o) return x == n.getX(); return false; }
}

class C2 : I2
{
   int x;
   int getX() { return x; }
   bool opEquals(Object o)
   { if(auto n = cast(I2)o) return x == n.getX(); return false; }
}

class C3 : I1, I2
{
   int x;
   int getX() { return x; }
   bool opEquals(Object o)
   {
      if(auto n = cast(I1)o) return x == n.getX();
      if(auto n = cast(I2)o) return x == n.getX();
      return false;
   }
}

This would lead me to conclude the *only* provably transitive opEquals starts with:

if(auto n = cast(typeof(this))other)

which is quite limited IMO.

-Steve



----- Original Message ----
> From: Andrei Alexandrescu <andrei at erdani.com>
> Let's suppose we allow 
> the feature above. Then a StevesTextWidget can claim equality with a TextWidget 
> in spite of the latter's opposition. But then a WaltersTextWidget could also 
> claim equality with the same TextWidget, again in spite of the latter's 
> opposition. But then StevesTextWidget may not compare equal with 
> WaltersTextWidget, which would break transitivity.



      


More information about the phobos mailing list