Объявите интерфейс в паскале объекта и используйте его как возвращаемое значение
Использование 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 внутри, так что есть некоторые накладные расходы, когда он блокирует и разблокирует список.