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, которая отличается) было бы достаточно, но это - в противном случае простой и тривиальный взлом - чрезвычайно грязный, никто не хочет использовать такие вещи в своем коде. Но о "чистом" способе - создании нового объекта с правильным классом, а затем копировании и освобождении исходного - явно не может быть и речи.

Итак, есть ли у кого-нибудь более достойная идея сделать это?

0 ответов

Другие вопросы по тегам