| 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
Permalink
Reply