Thread overview
interface is interface
Jun 17, 2014
Pavel
Jun 18, 2014
rumbu
June 17, 2014
Hello!

import std.stdio;

interface I {
	
}

interface B : I {
	void test();
}

interface C : I {
	void test1();
}

class A : B, C {
  override void test() {}
  override void test1() {}
}

void main() {
	A a = new A();
	I b = cast(B)a;
	I c = cast(C)a;

writeln(cast(void*)a, "  ", cast(void*)b, "  ", cast(void*)c); // 1EE1FE0  1EE1FE8  1EE1FEC

assert (a is b); // OK
assert (a is c); // FAIL WHY????
	
}
June 17, 2014
On Tue, 17 Jun 2014 15:02:33 -0400, Pavel <phondogo@gmail.com> wrote:

> Hello!
>
> import std.stdio;
>
> interface I {
> 	
> }
>
> interface B : I {
> 	void test();
> }
>
> interface C : I {
> 	void test1();
> }
>
> class A : B, C {
>    override void test() {}
>    override void test1() {}
> }
>
> void main() {
> 	A a = new A();
> 	I b = cast(B)a;
> 	I c = cast(C)a;
>
> writeln(cast(void*)a, "  ", cast(void*)b, "  ", cast(void*)c); // 1EE1FE0  1EE1FE8  1EE1FEC

b and c should be identical IMO. This means there are 2 entries for I inside the object, which is a waste of space.

>
> assert (a is b); // OK

This should also fail. It seems like a bug to me. 'is' should compare pointers, not anything else.

-Steve
June 18, 2014
On Tuesday, 17 June 2014 at 19:02:34 UTC, Pavel wrote:

> class A : B, C {
>   override void test() {}
>   override void test1() {}
> }

If you swap the interfaces (class A: C, B), "a is b" will return false, but "a is c" will return true. Clearly, this is a bug.

>
> void main() {
> 	A a = new A();
> 	I b = cast(B)a;
> 	I c = cast(C)a;
>

If you remove the casts, will work as expected:

I b = a;
I c = a;

or even:

B b = a;
C c = a;