digitalmars.D.learn - Run-time reflection for class inheritance
- Michael Green (51/51) Dec 01 2019 I don't know if this would be a sensible approach to try and get
- Michael Green (4/6) Dec 01 2019 [note to self - shouldn't make last minute checks and reverse
- Adam D. Ruppe (10/13) Dec 01 2019 You can get the type at runtime by simply casting it...
- Michael Green (14/18) Dec 02 2019 Thanks.
I don't know if this would be a sensible approach to try and get
at the actual class types for objects stored in some container at
runtime?
I have noticed that this approach doesn't work if Event is an
interface rather than a ancestor class.
```
import std.stdio;
import std.string;
import std.traits;
import std.conv;
interface Event {
void report() {
writeln("an event");
}
}
class EventTimer : Event {
override void report() {
writeln("timer event");
}
}
class EventSocket: Event {
override void report() {
writeln("socket event");
}
}
void main(string[] args) {
Event[] events;
foreach (arg; args[1..$]) {
// just something to pick actual type at runtime
if (to!int(arg) > 5) {
events ~= new EventTimer();
} else {
events ~= new EventSocket();
}
}
foreach (event; events) {
switch (event.classinfo.name) {
case fullyQualifiedName!EventTimer:
writeln("found timer event");
break;
case fullyQualifiedName!EventSocket:
writeln("found socket event");
break;
default:
throw new Exception("unknown event type");
break;
}
event.report();
}
}
```
Dec 01 2019
On Sunday, 1 December 2019 at 12:26:03 UTC, Michael Green wrote:interface Event {[note to self - shouldn't make last minute checks and reverse them by hand before posting] That should of course read:class Event {
Dec 01 2019
On Sunday, 1 December 2019 at 12:26:03 UTC, Michael Green wrote:I don't know if this would be a sensible approach to try and get at the actual class types for objects stored in some container at runtime?You can get the type at runtime by simply casting it... if(auto c = cast(EventSocket) event) { // is an event socket } and then you can actually use the c object too. Or if you put the necessary functionality in the interface then you simply call the method - this is better object-oriented design as it reduces the necessary knowledge for the function to use the object.
Dec 01 2019
On Sunday, 1 December 2019 at 14:42:46 UTC, Adam D. Ruppe wrote:
You can get the type at runtime by simply casting it...
if(auto c = cast(EventSocket) event) {
// is an event socket
}
Thanks.
I guess you need to be careful about which order you do those
tests so as not to cast to more general types before testing for
specific ones.
I also came up with
```
if (typeid(event) == typeid(EventTimer)) {
// do something
}
```
The reason I was leaning toward the first one is that it could be
put in a switch as it's just string compares.
I guess having it cast as part of the check is useful.
Dec 02 2019









Michael Green <abc.mikey gmail.com> 