Hi!
I want to change a method Draw
on a custom object when the MouseIn
event occurs.
This is known as "Change State" of the object: Init
-> Hovered
.
I want to change the state of an object by changing its class, like this:
this.__vptr = typeid(CLS).vtbl.ptr;
I have read the ABI and am confident in replacing __vptr
as long as the classes contain the same fields and the same interfaces.
Example:
// O
// to!state
// State_Init : O
// Draw
// State_Hovered : O
// Draw
//
// o.to!State_Hovered
// o.to!State_Init
class O
{
void to(CLS)()
{
// if (same fields && same interfaces && same instance size)
this.__vptr =
cast(immutable(void*)*)typeid(CLS).vtbl.ptr;
}
}
State_Init : O
void Draw() { /* ... */ }
State_Hovered : O
void Draw() { /* ... */ }
when MouseIn:
...
o.to!State_Hovered();
...
when MouseOut:
...
o.to!State_Init();
...
It works! But I want to ask how to make this 100% the best of the best?
What should I consider before changing __vptr
?