Thread overview
opEquals for same type
Dec 05, 2012
deed
Dec 05, 2012
Ali Çehreli
Dec 05, 2012
deed
December 05, 2012
interface I
{
    // ...
    bool opEquals(I i);
}

class C : I
{
    // ...
    bool opEquals(I i)
    {
        return true;
    }
}

void main()
{
    I i1 = new C;
    I i2 = new C;
    assert(i1 == i2); // Assertion failure
    assert(i1 != i2); // Passes, although it's the opposite of what I want...
}

What's missing?
December 05, 2012
On 12/04/2012 04:12 PM, deed wrote:
> interface I
> {
> // ...
> bool opEquals(I i);
> }
>
> class C : I
> {
> // ...
> bool opEquals(I i)
> {
> return true;
> }
> }
>
> void main()
> {
> I i1 = new C;
> I i2 = new C;
> assert(i1 == i2); // Assertion failure
> assert(i1 != i2); // Passes, although it's the opposite of what I want...
> }
>
> What's missing?

opEquals is a special function of Object but interface's do not inherit from Object. Just override it on the class:

interface I
{
    // ...
    // bool opEquals(I i);
}

class C : I
{
    int i;

    // ...
    override bool opEquals(Object o) const
    {
        auto rhs = cast(const C)o;

        return (rhs && (i == rhs.i));
    }
}

void main()
{
    I i1 = new C;
    I i2 = new C;
    assert(i1 == i2);
}

What I know about this topic is in the following chapter:

  http://ddili.org/ders/d.en/object.html

Ali

-- 
D Programming Language Tutorial: http://ddili.org/ders/d.en/index.html
December 05, 2012
> What I know about this topic is in the following chapter:
>
>   http://ddili.org/ders/d.en/object.html
>
> Ali

Thanks, Ali. That clarifies why it worked with opCmp and not with opEquals.