Проблемы наследования в TThread, похоже, не работают в D2010 так же, как в D7 - PullRequest
2 голосов
/ 25 января 2011

В моем приложении у меня есть два объекта потока (Outer и Sash), которые наследуются от объекта базового потока (FrameObject) типа TThread. Это все прекрасно работает в D7. Приложение должно быть расширено, и я пользуюсь этой возможностью, чтобы переместить его в D2010 - однако, когда я пытаюсь скомпилировать Delphi, он жалуется, что объявление метода FrameObject Create отличается от предыдущего объявления.

Типы классов и конструкторы показаны ниже;

TFrameObject = class(TThread)

constructor TFrameObject.Create(BuildType: TBuildType; OnBatchStep: TBatchNotify; OnThreadComplete: TNotifyTermination);
begin
  inherited Create(True);
  ...
end;


TOuter = class (TFrameObject)

constructor Create(BuildType: TBuildType; OnBatchStep: TBatchNotify;  OnThreadComplete: TNotifyTermination; ExceptionHandler: TExceptionHandler);
begin
  inherited create(BuildType, OnBatchStep, OnThreadComplete);
  fExceptionHandler := ExceptionHandler;
  ...
end;

TSash = class (TFrameObject)
constructor Create(BuildType: TBuildType; OnBatchStep: TBatchNotify;  OnThreadComplete: TNotifyTermination; ExceptionHandler: TExceptionHandler);
begin
  inherited create(BuildType, OnBatchStep, OnThreadComplete);
  fExceptionHandler := ExceptionHandler;
  ...
end;

Код D2010 является прямой копией исходных файлов D7, и, как я уже сказал, все это прекрасно работает в D7 (возможно, не должно!) - так в чем же я ошибаюсь?

Ответы [ 3 ]

3 голосов
/ 25 января 2011

Проверьте типы, объявленные в нескольких единицах, где один из них используется в интерфейсе, а другой в разделе реализации, поэтому, например, TBuildType в вашем объявлении TFrameObject (в разделе интерфейса) разрешит UnitA.TBuildTypeи реализация до UnitB.TBuildType.

1 голос
/ 25 января 2011

Как и в других ответах, наиболее вероятным объяснением является новый тип введения в модуле, используемый в разделе реализации, скрывающий тип с тем же именем, используемым или объявленным в разделе интерфейса.

Однако, в отличие от предыдущих ответов, поскольку проблема возникает только в D2010, а не в D7, я бы заподозрил параметр ExceptionHandler типа TExceptionHandler , поскольку D2010 включает тип с этим именем объявлено в ToolsAPI \ IStreams .

Вы можете указать имя в разделе реализации:

  TFrameObject.Create(... ExceptionHandler: MyUnit.TExpectionHandler)

Где "MyUnit" - это имя модуля, содержащего "настоящий" TExceptionHandler, который вы хотите использовать.

Или вы можете создать псевдоним типа в разделе интерфейса и изменить списки параметров, чтобы последовательно использовать псевдоним типа как в интерфейсе, так и в реализации этого модуля:

  interface

   type
     TFrameExceptionHandler = TExceptionHandler;

     TFrameObject = class...
       ...
       constructor Create(... ExceptionHandler: TFrameExceptionHandler);
     end;


  implementation

     constructor TFrameObject.Create(... ExceptionHandler: TFrameExceptionHandler);
1 голос
/ 25 января 2011

Я предполагаю, что здесь происходит, что предложение uses в разделе вашей реализации объявляет TBuildType, TBatchNotify или TNotifyTermination, которое отличается от того, которое используется в разделе интерфейса, где вы объявляете конструктор.

Быстрый способ проверить это - полностью квалифицировать эти типы при реализации TFrameObject.Create.

...