Чтобы иметь возможность проверить, если экземпляр реализует данный интерфейс, что интерфейс должен иметь определенный идентификатор GUID. Таким образом, добавить GUID в интерфейс (вы также будете нуждаться в этом Guid в константный или переменной, так что вы можете Refernce позже в коде):
const
IID_Handle: TGUID = '{0D3599E1-2E1B-4BC1-ABC9-B654817EC6F1}';
type
IHandle<TMessage> = interface
['{0D3599E1-2E1B-4BC1-ABC9-B654817EC6F1}']
procedure Handle(AMessage: TMessage);
end;
(Вы не должны использовать свой GUID, это просто пример .. нажмите ctrl + shift + G, чтобы создать новый указатель в среде IDE).
Затем проверьте, если зарегистрированный абонент поддерживает этот интерфейс:
// LTarget:= LReference as IHandle; // <-- Wish this would work
if Supports(LReference, IID_Handle, LTarget) then
LTarget.Handle(AMessage);
Однако это не занимает общую часть интерфейса во внимание, что только проверяет GUID.
Для этого вам потребуется дополнительная логика, чтобы проверить, действительно ли объект поддерживает тип сообщения.
Кроме того, поскольку вы имеете дело с классами, которые будут реализовывать интерфейс и, следовательно, должны вытекать из TInterfacedObject (или совместимого интерфейса с этим классом), вы должны хранить все ссылки на созданный объект в переменных интерфейса, список подписчиков из ссылки на TObjects 'на один из II-интерфейсов'. И в этом есть определенный класс для этого тоже:
FSubscribers: TInterfaceList;
Конечно, вы должны изменить подпись к подписываться/отписываться функции тоже:
procedure Subscribe(AInstance: IInterface);
procedure Unsubscribe(AInstance: IInterface);
Я думаю, что лучший путь будет вывести общий интерфейс IHandle. Таким образом, вы можете обеспечить, чтобы все подписчики реализовали базовый интерфейс IHandler, изменив подпись subscribe/unsibscribe, чтобы взять IHandler вместо IInterface.
Затем IHandler может использовать функции, необходимые для определения того, поддерживает ли абонент данный тип сообщения или нет.
Это будет прочитано читателем как упражнение. Вы можете начать с моего маленького тестового приложения (D2010), которое вы можете скачать с My Test App.
N.B. Приложение-тест исследует возможность использования дженериков в интерфейсе и, скорее всего, сбой при публикации событий. Используйте отладчик на один шаг, чтобы узнать, что произойдет.Я не сбой при публикации целого числа 0, который, похоже, работает. Причина в том, что как Int, так и String-обработчик будут вызваны независимо от типа ввода для публикации (как обсуждалось ранее).
Обратите внимание, что [QualityCentral теперь закрыть] (https://community.embarcadero.com/blogs/entry/quality-keeps-moving-forward) , поэтому вы больше не можете обращаться к ссылкам 'qc.embarcadero.com'. Если вам нужен доступ к старым данным QC, посмотрите на [QCScraper] (http://www.uweraabe.de/Blog/2017/06/09/how-to-save-qualitycentral/). –