Delphi - Убедитесь, что конструктор класса называется - PullRequest
7 голосов
/ 11 июля 2011

Это, вероятно, простой вопрос, но я хотел бы знать, как обеспечить вызов конструктора класса.

Если у меня есть следующий код:

type TMyObject = class(TObject)
  public
     constructor Create;override;
end;

implementation 

constructor TMyObject.Create;override;
begin
  inherited;
  //do other instantiation
end;

Delphi не допускает этого - «Невозможно переопределить статический метод».

То, что я хотел бы сделать, это убедиться, что объект создан с использованием моего пользовательского конструктора Create и запретить вызов предка конструктора Create.

Мое текущее решение этой проблемы - определить конструктор Create с уникальной подписью, например:

constructor Create(aName : String);overload;

но программист может потенциально вызвать метод Create () предков.

Ответы [ 2 ]

14 голосов
/ 11 июля 2011

Вы просто заново вводите конструктор с именем предка.Как только вы это сделаете, пользователь не сможет создать TMyObject, вызывающий конструктор, введенный в TObject.Если вы используете такой код:

TMyObject = class
public
  constructor Create;
end;

constructor TMyObject.Create;
begin
  // I am not calling the inherited constructor because
  // I do not want to.
end;

Вы не используете модификатор override на TMyObject.Create, потому что конструктор предка не является виртуальным.

Используя эту схему, это невозможнодля пользователя, чтобы создать TMyObject, используя конструктор, введенный в предка.В этом случае предком является TObject, а единственным конструктором является TObject.Create.Если пользователь пишет этот код:

X := TMyObject.Create;

, это вполне очевидно, будет вызван конструктор TMyObject, а не тот, который введен в TObject.


Если выопасаясь, что пользователи будут перепрыгивать через обручи, чтобы создать свой класс с помощью конструктора предка, вы можете делать это с помощью метода AfterConstruction.Это виртуальный метод, поэтому он вызывается, даже если ваш объект создан с использованием ссылки на класс типа предка:

TMyObject = class
public
  procedure AfterConstruction;override;
end;
6 голосов
/ 11 июля 2011

TObject.Create не является виртуальным конструктором, поэтому возникает ошибка.

Единственный способ, которым «другие программисты» могут вызывать наследственный метод Create, - это намеренно перепрыгивать через некоторые циклы, например * 1003.*

var
  ClassRef: TClass;
  Obj : TObject;
begin
  ClassRef := TMyObject;
  Obj := ClassRef.Create;
end;

, так как недавно представленный конструктор скроет не виртуальный TObject.Create

То, что вы хотите, вероятно, больше похоже на:

type TMyObject = class(TObject)
  public
     constructor Create;virtual;
end;

implementation 

constructor TMyObject.Create;
begin
  inherited;
  //do other instantiation
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...