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

Использование Delphi 7. Вот (неполный) пример, который демонстрирует мою проблему:

interface
uses Classes, Contnrs;

type
   IEditorModule = interface;
   procedure Method1;
   procedure Method2;
   end;

   TEditorModuleList = class(TList)
   protected
    function GetItem(Index: Integer): IEditorModule;
    procedure SetItem(Index: Integer; const Value: IEditorModule);
   public
    property  Items[Index: Integer]: IEditorModule
      read GetItem write SetItem; default;   
   end;

implementation

function TEditorModuleList.GetItem(Index: Integer): IEditorModule;
begin
  Result := IEditorModule(inherited Items[index]);
end;

Не могу скомпилировать это, потому что я получаю эту ошибку:

[Ошибка] LEditorModule.pas(73): Несовместимые типы: "IEditorModule" и "TObject"

Основная причина объявления нового потомка TList состоит в том, чтобы иметь возможность делать такие вещи, как:

aModuleList[3].Method1;

Какой синтаксис позволит мне привести объект к интерфейсу (вместо конкретного класса)? Факты:

  • Я не могу сделать TEditorModule классом. Это должен быть интерфейс, потому что классы в совершенно разных иерархиях будут его реализовывать.
  • Мне нужно иметь класс для хранения ссылок на список объектов, которые реализуют интерфейс IEditorModule.

Как мне это сделать?

1 ответ

Решение

Самое простое, что можно сделать, это использовать TInterfaceList для интерфейсов. Он доступен в Delphi 7. В TInterfaceList встроена некоторая логика для управления счетчиками ссылок, например, установка их на ноль при очистке списка.

Если вы посмотрите на код, стоящий за TInterfaceList, вы увидите некоторые действия, которые происходят.

Одна вещь, с которой вам следует быть осторожным, это то, что TInterfaceList использует TThreadList внутри, так что есть некоторые накладные расходы, когда он блокирует и разблокирует список.

Другие вопросы по тегам