Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
July 25, 2016 Getting most derived type of object that implements interface | ||||
---|---|---|---|---|
| ||||
I'm having trouble getting the full name of an object of a class that implements an interface, using typeid() or .classinfo, the behavior seems to be different from that of a class that simply derives other classes. interface FooInterface {} class BarImplementsInterface : FooInterface {} class FooBaseClass {} class BarDerivedClass : FooBaseClass {} void main() { FooInterface a = new BarImplementsInterface(); FooBaseClass b = new BarDerivedClass(); writefln("a class: %s", a.classinfo.name); writefln("b class: %s", b.classinfo.name); } Output: a class: test.FooInterface b class: test.BarDerivedClass I expected "a class: test.BarImplementsInterface" as the result output.. Am I expecting the wrong behavior? Is there a preferred way to do this? |
July 25, 2016 Re: Getting most derived type of object that implements interface | ||||
---|---|---|---|---|
| ||||
Posted in reply to cc | Cast it to Object: FooInterface a = new BarImplementsInterface(); FooBaseClass b = new BarDerivedClass(); Object o = cast(Object)a; writefln("a class: %s", a.classinfo.name); writefln("b class: %s", b.classinfo.name); writefln("o class: %s", o.classinfo.name); |
July 25, 2016 Re: Getting most derived type of object that implements interface | ||||
---|---|---|---|---|
| ||||
Posted in reply to cc | yep, cast it. without the cast, compiler assuming that it knows the type in runtime, and is using well-known classinfo address instead of really looking into instance for that. |
July 25, 2016 Re: Getting most derived type of object that implements interface | ||||
---|---|---|---|---|
| ||||
Posted in reply to Kagamin | On 7/25/16 5:54 AM, Kagamin wrote:
> Cast it to Object:
> FooInterface a = new BarImplementsInterface();
> FooBaseClass b = new BarDerivedClass();
> Object o = cast(Object)a;
> writefln("a class: %s", a.classinfo.name);
> writefln("b class: %s", b.classinfo.name);
> writefln("o class: %s", o.classinfo.name);
Yes, for the unrelated reason that COM objects may not be D objects, interfaces that can only possibly be D Objects don't implicitly cast to Object.
-Steve
|
Copyright © 1999-2021 by the D Language Foundation