При работе с интерфейсами в Delphi иногда возникает необходимость приведения объекта, реализующего производный интерфейс, к базовому интерфейсу, не добавляя базовый интерфейс в список поддерживаемых. В данной статье мы рассмотрим, как можно безопасно выполнить такое приведение.
Проблема
Допустим, у нас есть следующие интерфейсы и класс, реализующий их:
Мы знаем, что объект, реализующий IDerived, автоматически реализует и базовый интерфейс IBase. Однако, если мы попытаемся проверить это с помощью функции Supports, мы получим ложный результат, так как IBase не указан в списке поддерживаемых интерфейсов TImplementation.
Решение
Чтобы безопасно привести интерфейс к базовому типу, не добавляя IBase в список поддерживаемых, можно использовать следующий подход:
Создать объект, реализующий интерфейс IDerived.
Привести объект к интерфейсу IBase с помощью оператора as.
Добавить полученный интерфейс в контейнер, например, TInterfaceList.
Перед использованием интерфейса из контейнера проверить его на соответствие типу IBase с помощью функции Supports и только после этого выполнить приведение.
Вот пример кода, демонстрирующего данный подход:
procedure Test2;
var
A: IDerived;
B: IBase;
List: TInterfaceList;
begin
A := TImplementation.Create as IDerived;
B := A as IBase; // Безопасное приведение к базовому интерфейсу
List := TInterfaceList.Create;
List.Add(IInterface(B));
if Supports(List[0], IBase) then
begin
// Приведение к IBase безопасно, можно использовать методы интерфейса
(List[0] as IBase).DoWhatever;
end
else
begin
// Приведение не безопасно, вызов метода приведет к ошибке
end;
List.Free;
end;
Важные моменты
Использование оператора as позволяет безопасно привести интерфейс к базовому типу без необходимости явного указания в списке поддерживаемых.
Перед использованием интерфейса из контейнера следует проверить его на соответствие нужному типу с помощью функции Supports.
Такой подход позволяет избежать добавления IBase в список поддерживаемых интерфейсов TImplementation, что может быть важно для выполнения определенных требований (например, сравнения ссылок на равенство).
Следуя этим рекомендациям, вы сможете безопасно работать с интерфейсами в Delphi, не нарушая типовой безопасности и не внося излишних изменений в структуру вашего кода.
Статья о безопасном приведении интерфейса в Delphi к базовому типу без добавления его в список поддерживаемых.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.