www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 7470] New: opEquals for interfaces

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=7470

           Summary: opEquals for interfaces
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: dawg dawgfoto.de



interface I
{
    int value();
    equals_t opEquals(I other);
    // final opEquals should be allowed too
    // final equals_t opEquals(I other) { return value() == other.value(); }
}

class A : I
{
    override int value() { return 0; }
    override equals_t opEquals(I other) { return value() == other.value(); }
}

class B : I
{
    override int value() { return 0; }
    override equals_t opEquals(I other) { return value() == other.value(); }
}

void main()
{
    I i1 = new A, i2 = new B;
    assert(i1 == i2);
}

----

I think this was the actual issue that Steven filed under bug 4088.
Using explicit casts solved compiler generated interface comparison,
but doesn't allow a real opEquals for interfaces.

Note that opCmp works as expected.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Feb 08 2012
parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=7470


Steven Schveighoffer <schveiguy yahoo.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |schveiguy yahoo.com



07:36:48 PST ---
The original test case was that I could not compare two interfaces in the way
you say, yes.  But you can compare two interfaces via Object:

interface I
{
}

class C : I
{
}

void main()
{
   I i1 = new C, i2 = new C;
   assert(i1 == i2); // should work now, did not work before
}

Prior to the fix, you could not compare two interfaces under *any
circumstances*.  This at least allows interfaces to pull in Object's method for
opEquals.

What you are asking for is for interfaces (and by extension objects) to be
comparable to other objects using a derived type, which I think could be a
useful addition, but complex in implementation.  You don't want to get into a
situation where two objects compare differently depending on the static type
used.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Feb 09 2012