Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
October 01, 2010 Inheriting from an interface twice | ||||
---|---|---|---|---|
| ||||
I always thought that in D interface inheritance is always virtual, i.e. you only inherit it once even if it is specified twice (or more) within hierarchy. Until I got an assertion on the following test (reduced from a real example): interface Foo { } class Bar : Foo { } class Baz : Bar, Foo { } void main() { Baz baz = new Baz(); Bar bar = baz; Foo foo1 = bar; Foo foo2 = baz; assert(foo1 is foo2); } foo1 and foo2 have the same type and point to the same object. Yet they have different addresses. Is it a bug, or a feature? The test above passes for C# (http://ideone.com/xK5Mu) and C++ (http://ideone.com/MnnL8 virtual inheritance used, fails otherwise, of course). |
October 01, 2010 Re: Inheriting from an interface twice | ||||
---|---|---|---|---|
| ||||
Posted in reply to Denis Koroskin | > void main()
> {
> Baz baz = new Baz();
> Bar bar = baz;
>
> Foo foo1 = bar;
> Foo foo2 = baz;
>
> assert(foo1 is foo2);
> }
>
>
> foo1 and foo2 have the same type and point to the same object. Yet they have different addresses. Is it a bug, or a feature?
Looks fine?! Isn't foo1 == foo2 what you want?
|
October 01, 2010 Re: Inheriting from an interface twice | ||||
---|---|---|---|---|
| ||||
Posted in reply to Trass3r | Trass3r <un@known.com> wrote: >> void main() >> { >> Baz baz = new Baz(); >> Bar bar = baz; >> >> Foo foo1 = bar; >> Foo foo2 = baz; >> >> assert(foo1 is foo2); >> } >> >> >> foo1 and foo2 have the same type and point to the same object. Yet they have different addresses. Is it a bug, or a feature? > > Looks fine?! Isn't foo1 == foo2 what you want? He mentioned that the code asserts. I say this is fishy, but I don't know if it should assert or not. -- Simen |
October 01, 2010 Re: Inheriting from an interface twice | ||||
---|---|---|---|---|
| ||||
Posted in reply to Trass3r | On Fri, 01 Oct 2010 19:36:11 +0400, Trass3r <un@known.com> wrote:
>> void main()
>> {
>> Baz baz = new Baz();
>> Bar bar = baz;
>>
>> Foo foo1 = bar;
>> Foo foo2 = baz;
>>
>> assert(foo1 is foo2);
>> }
>>
>>
>> foo1 and foo2 have the same type and point to the same object. Yet they have different addresses. Is it a bug, or a feature?
>
> Looks fine?! Isn't foo1 == foo2 what you want?
Sadly, opEquals is only defined for Objects, not interfaces:
Error: function object.opEquals (Object lhs, Object rhs) is not callable using argument types (Foo,Foo)
Besides, I put `is' on purpose. With that assertion I make sure that references are *same*, not that they are equal.
|
October 04, 2010 Re: Inheriting from an interface twice | ||||
---|---|---|---|---|
| ||||
Posted in reply to Denis Koroskin | On Fri, 01 Oct 2010 04:32:24 -0400, Denis Koroskin <2korden@gmail.com> wrote:
> I always thought that in D interface inheritance is always virtual, i.e. you only inherit it once even if it is specified twice (or more) within hierarchy.
>
> Until I got an assertion on the following test (reduced from a real example):
>
> interface Foo
> {
> }
>
> class Bar : Foo
> {
> }
>
> class Baz : Bar, Foo
> {
> }
>
> void main()
> {
> Baz baz = new Baz();
> Bar bar = baz;
>
> Foo foo1 = bar;
> Foo foo2 = baz;
>
> assert(foo1 is foo2);
> }
>
>
> foo1 and foo2 have the same type and point to the same object. Yet they have different addresses. Is it a bug, or a feature?
>
> The test above passes for C# (http://ideone.com/xK5Mu) and C++ (http://ideone.com/MnnL8 virtual inheritance used, fails otherwise, of course).
I agree, I think you should file a bug on this.
-Steve
|
October 04, 2010 Re: Inheriting from an interface twice | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Mon, 04 Oct 2010 15:39:46 +0400, Steven Schveighoffer <schveiguy@yahoo.com> wrote: > On Fri, 01 Oct 2010 04:32:24 -0400, Denis Koroskin <2korden@gmail.com> wrote: > >> I always thought that in D interface inheritance is always virtual, i.e. you only inherit it once even if it is specified twice (or more) within hierarchy. >> >> Until I got an assertion on the following test (reduced from a real example): >> >> interface Foo >> { >> } >> >> class Bar : Foo >> { >> } >> >> class Baz : Bar, Foo >> { >> } >> >> void main() >> { >> Baz baz = new Baz(); >> Bar bar = baz; >> >> Foo foo1 = bar; >> Foo foo2 = baz; >> >> assert(foo1 is foo2); >> } >> >> >> foo1 and foo2 have the same type and point to the same object. Yet they have different addresses. Is it a bug, or a feature? >> >> The test above passes for C# (http://ideone.com/xK5Mu) and C++ (http://ideone.com/MnnL8 virtual inheritance used, fails otherwise, of course). > > I agree, I think you should file a bug on this. > > -Steve Already done: http://d.puremagic.com/issues/show_bug.cgi?id=4979 |
Copyright © 1999-2021 by the D Language Foundation