Почему производный конструктор не вызывается при создании экземпляра через фабрику класса метакласса? - PullRequest
6 голосов
/ 06 мая 2011

Я пытаюсь создать то, что я понимаю, как Фабрику Классов в Delphi 2007. Я хочу передать производный тип класса в функцию и заставить его создать объект этого типа класса.

Я нашел несколько хороших ссылок, таких как Как я могу создать объект Delphi из ссылки на класс и обеспечить выполнение конструктора? , но я все еще не могу заставить его работать достаточноправо.В приведенном ниже тесте я не могу заставить его вызывать производный конструктор, хотя отладчик сообщает мне, что oClass - это TMyDerived.

Я думаю, что я запутался в чем-то фундаментальном здесь и мог бы использовать некоторые объяснения.Спасибо.

program ClassFactoryTest;
{$APPTYPE CONSOLE}
uses
  SysUtils;

//  BASE CLASS
type
  TMyBase = class(TObject)
    bBaseFlag : boolean;
    constructor Create; virtual;
  end;
  TMyBaseClass = class of TMyBase;

constructor TMyBase.Create;
begin
  bBaseFlag := false;
end;

//  DERIVED CLASS
type
  TMyDerived = class(TMyBase)
    bDerivedFlag : boolean;
    constructor Create;
  end;

constructor TMyDerived.Create;
begin
  inherited;
  bDerivedFlag := false;
end;

var
  oClass: TMyBaseClass;
  oBaseInstance, oDerivedInstance: TMyBase;
begin
  oClass := TMyBase;
  oBaseInstance := oClass.Create;

  oClass := TMyDerived;
  oDerivedInstance := oClass.Create;  // <-- Still calling Base Class constructor
end.

1 Ответ

13 голосов
/ 06 мая 2011

Вы не указали override в конструкторе производного класса. (Я бы ожидал предупреждения от компилятора о сокрытии метода базового класса.) Добавьте это, и вы должны увидеть TMyDerived.Create с именем.

TMyDerived = class(TMyBase)
  bDerivedFlag : boolean;
  constructor Create; override;
end;

Альтернатива, так как ваши конструкторы не принимают параметров, это отказаться от виртуальных конструкторов и просто переопределить AfterConstruction.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...