Thread overview | |||||
---|---|---|---|---|---|
|
June 17, 2014 interface is interface | ||||
---|---|---|---|---|
| ||||
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 Re: interface is interface | ||||
---|---|---|---|---|
| ||||
Posted in reply to Pavel | 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 Re: interface is interface | ||||
---|---|---|---|---|
| ||||
Posted in reply to Pavel | 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; |
Copyright © 1999-2021 by the D Language Foundation