Пусть в Delphi у вас есть эти классы:Возможно ли создать «супернаследованный конструктор», вызывающий hiearchy не виртуальных конструкторов или методов?
type
TClass1 = class
public
constructor Create;
end;
TClass2 = class(TClass1)
public
constructor Create;
end;
TClass3 = class(TClass2)
public
constructor Create;
end;
Обратите внимание, что TClass1.Create не является виртуальным, и что TClass2 и TClass3 объявить конструктор, который не является виртуальным.
Предположим, что я хочу вызвать конструктор-метод Create TClass1, изнутри TClass3.Create, но не вызывать конструктор-код в TClass2.Create? Возможно ли это на языке без обращения к RTTI?
Я не думаю, что есть такой синтаксис, но то, что я хочу это:
constructor TClass3.Create;
begin
super inherited Create; // Invoke TClass1.Create
end;
Ближайший я могу получить это, который компилирует, но только просачивается объект, как это делает отдельный TClass1. Создайте конструкцию.
constructor TClass3.Create;
begin
TClass1.Create; // returns new TClass1, discards and leaks it.
// other initialization here.
end;
Также мне кажется, что код TClass1.Create
вызов в TClass3.Create
компилирует, я не могу назвать это правильно, это неправильно, потому что утечка объект. Каков правильный правильный способ сделать это?
Обновление Обратите внимание, что ответ Дэвида работает для класса hiearchy без виртуальных конструкторов, только, как я изначально спросил. Его ответ не будет работать в вашем коде, если бы у вас были виртуальные конструкторы, а TClass2 и TClass3 переопределили их. Если бы я задал вышеуказанный вопрос с помощью виртуальных конструкторов (или виртуального метода, который не является конструктором), ответ будет «вы не можете сделать это вообще, за исключением действительно валовых виртуальных таблиц виртуальных методов». Также обратите внимание, что связанный «возможный дубликат» не является дубликатом, потому что ответ изменяется, когда вы добавляете/вычитаете виртуальные методы из ситуации.
Я уверен, что вы можете обойти необходимость в такой конструкции, немного изменив иерархию классов, возможно, добавить общий базовый класс для 'TClass2' и' TClass3', полученный из 'TClass1' или что-то в этом роде. –
Если бы это был весь мой код, я бы это сделал. Однако я стараюсь избегать переписывания сторонних компонентов. –
Я думаю, что вызов типа 'TSomeClass.Create' выделяет память для экземпляра, а затем выполняет тело конструктора, тогда как вызовы типа« inherited Create »или' SomeInstance.Create' выполняют только тело на уже существующем экземпляре, поэтому 'TClass1.Create; 'не будет работать AFAICT. –