Проблема с обобщениями, интерфейсами и наследованием - PullRequest
6 голосов
/ 24 января 2011

Следующий пример дает мне эту ошибку:
[DCC Error] Unit2.pas(54): E2010 Incompatible types: 'IBar' and 'Unit2.TFoo<Unit2.IBar>'

Я думаю, что проблема где-то вокруг Self.Create Потому что после многих попыток его компилировать я случайно ввел FFoo: = TBar (Self) .Create; и это скомпилировано и работает.

Я использую Delphi XE

IFoo = interface
end;

TFoo<T: IInterface> = class(TInterfacedObject, IFoo)
private class var
  FFoo: T;
public class
  function Instance: T;
end;

IBar = interface(IFoo)
end;

TBar = class(TFoo<IBar>, IBar)
end;

class function TFoo<T>.Instance: T;
begin
  if not Assigned(FFoo) then
  begin
    FFoo := Self.Create;
  end;
  Result := FFoo;
end;

Ответы [ 2 ]

4 голосов
/ 24 января 2011

Проблема в этой строке с объявлением TBar:

FFoo := Self.Create;

Чтобы понять, давайте объясним типы кода [отмечены так]:

FFoo:[IBar] := Self:[TFoo(IBar)].Create():[TFoo<IBar>]

Итак,Подводя итог, мы имеем: [IBar] := [TFoo<IBar>]
Совместимы ли эти типы?
A [TFoo] только реализует IFoo интерфейс, нет IBar какэто указано в вашем коде

TFoo<T: IInterface> = class(TInterfacedObject, IFoo)

Это ошибка компиляции!
ОБНОВЛЕНИЕ: Решение 1
Чтобы устранить проблему: измените TBar объявление

TBar = class(TFoo<IFoo>, IBar)
end;

ОБНОВЛЕНИЕ: Решение 2
Замените FFoo := Self.Create на

FFoo := Self.Create.Instance;

и так оно и будет!

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

Ваш TFoo не реализует T как интерфейс.Вот почему FFoo и экземпляр TFoo не совместимы.Если вы хотите назначить экземпляр TFoo для FFoo, вам нужно сделать его hardcast.

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