www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Inheriting from an interface twice

reply "Denis Koroskin" <2korden gmail.com> writes:
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).
Oct 01 2010
next sibling parent reply Trass3r <un known.com> writes:
 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?
Oct 01 2010
next sibling parent "Simen kjaeraas" <simen.kjaras gmail.com> writes:
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
Oct 01 2010
prev sibling parent "Denis Koroskin" <2korden gmail.com> writes:
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.
Oct 01 2010
prev sibling next sibling parent "Steven Schveighoffer" <schveiguy yahoo.com> writes:
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
Oct 04 2010
prev sibling parent "Denis Koroskin" <2korden gmail.com> writes:
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
Oct 04 2010