Невозможно назначить объект TMyClass переменной его базового типа интерфейса - PullRequest
2 голосов
/ 06 марта 2012

Почему я не могу назначить класс переменной базового типа интерфейса.

Считайте, что у нас есть следующее:

IInt1 = interface
  procedure Test1;
end;

IInt2 = interface(IInt1)
  procedure Test2;
end;

TCustomClass = class(TInterfacedObject)
end;

TMyClass = class(TCustomClass, IInt2)
  procedure Test1;
  procedure Test2;
end;

var
  Obj: IInt1;
begin
  Obj := TMyClass.Create; // <!-- E2010 Incompatible types: 'IInt1' and 'TMyClass'
  ...
end;


E2010 Incompatible types: 'IInt1' and 'TMyClass'

Это ошибка в компиляторе или просто недопустимое действие. Можно ли обойти это?

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Включите IInt1 в список реализованных интерфейсов в вашей декларации:

TMyClass = class(TCustomClass, IInt1, IInt2)
end;
0 голосов
/ 06 марта 2012

Выше указаны три ошибки:

  1. Объявления класса должны содержать все члены, требуемые интерфейсом. Поэтому для TMyClass должны быть определены процедуры Test1 и Test2.
  2. Интерфейсы должны иметь GUID, как показано в коде ниже. Поместите курсор туда, где вы хотите, чтобы появился GUID, и нажмите CTRL-SHIFT-G, чтобы получить IDE, чтобы создать его для вас.
  3. Когда вы назначаете новый класс, вам нужно использовать ключевое слово AS для Typecast.

Следовательно, ваш фрагмент кода должен выглядеть следующим образом

IInt1 = interface
  ['{218BE5BB-0784-4E4A-923C-F1F1E116F38B}']
  procedure Test1;
end;

IInt2 = interface(IInt1)
  ['{635D00B2-AC59-43A9-A7DB-660F53EBCDD8}']
  procedure Test2;
end;

TCustomClass = class(TInterfacedObject)
private
  procedure Test1;
end;

TMyClass = class(TCustomClass, IInt2)
private
  procedure Test2;
end;

...

var
  Obj: IInt1;
begin
  Obj := TMyClass.Create AS IInt1;
  ...
...