Delphi: как динамически изменить тип класса, если отличается только VMT?
Предположим, у вас есть TAncestorClass
и его потомки TDescendantClass1
а также TDescendantClass2
. Также предположим, что потомки отличаются друг от друга только некоторыми по-разному переопределенными виртуальными методами. В остальном все поля идентичны. То есть ФИЗИЧЕСКИ фактические объекты одинаковы, только их VMT отличается.
TAncestorClass = class
...
procedure VirtualProc; virtual; abstract;
...
end;
TDescendantClass1 = class(TAncestorClass)
procedure VirtualProc; override;
end;
TDescendantClass2 = class(TAncestorClass)
procedure VirtualProc; override;
end;
Пока ничего особенного.
Проблема в том, что я хочу динамически изменять уже созданный объект из TDescendantClass1
к TDescendantClass2
и наоборот, когда мне понадобится эта вещь. Не так уродливо, как кажется на первый взгляд - ведь предметы по сути те же. Я просто хочу, чтобы соответствующие виртуальные методы вызывались после каждого изменения типа. Теоретически замены VMT (или только зоны из VMT, которая отличается) было бы достаточно, но это - в противном случае простой и тривиальный взлом - чрезвычайно грязный, никто не хочет использовать такие вещи в своем коде. Но о "чистом" способе - создании нового объекта с правильным классом, а затем копировании и освобождении исходного - явно не может быть и речи.
Итак, есть ли у кого-нибудь более достойная идея сделать это?