Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Обход ограничений Delphi 5: преобразование указателя интерфейса в указатель на реализующий класс

Delphi , Программа и Интерфейс , Интерфейс

Вопрос, заданный разработчиком в Delphi 5, заключается в необходимости преобразования указателя интерфейса в указатель на реализующий класс. Это требуется для доступа к новым свойствам, которые были добавлены в реализующий класс, но не затрагивали сам интерфейс по историческим причинам.

Возможное дублирование вопроса:

Как преобразовать интерфейс в объект в Delphi

Проблема:

Используя Delphi 5, у разработчика есть интерфейс, который он не может изменить по причинам совместимости с предыдущими версиями. Указатели на этот интерфейс передаются по всему проекту. Реализующий класс содержит несколько новых свойств, и возникает вопрос: возможно ли как-то преобразовать указатель интерфейса в указатель на реализующий класс?

Решение:

Согласно информации с сайта Malcolm Groves, такая возможность появилась в Delphi 2010. Однако, для Delphi 5 существует альтернативный способ решения проблемы: использование библиотеки JEDI, в частности метода GetImplementorOfInterface.

Альтернативный способ:

Разработчик может реализовать у объекта интерфейс IObject, который позволит получить доступ к самому объекту через метод GetSelf. Пример кода:

IObject = interface(IUnknown)
    ['{39B4F98D-5CAC-42C5-AF8D-0237C8EFBE4C}']
    function GetSelf: TObject;
end;

var
   thingy: IThingy;
   o: TOriginalThingy;
begin
   o := (thingy as IObject).GetSelf as TOriginalThingy;
end

Обновление:

Для подчеркивания важности, можно добавить новый интерфейс к уже существующему объекту. Например, если у нас есть класс TOriginalThingy, реализующий интерфейс IThingy, то можно добавить к нему интерфейс IObject:

type
    TOriginalThingy = class(TInterfacedObject, IThingy, IObject)
    public
        //IThingy
        procedure DrinkCokeZero; safecall;
        procedure ExcreteCokeZero; cafecall;
        //IObject
        function GetSelf: TObject;
    end;

function TOriginalThingy.GetSelf: TObject;
begin
    Result := Self;
end;

Обычное использование:

procedure DiddleMyThingy(Thingy: IThingy);
var
    o: TThingy;
begin
    o := (Thingy as IObject).GetSelf as TThingy;
    o.Diddle;
end;

Подтвержденный ответ:

Существуют классические и более новые подходы к решению данной проблемы. Классический подход предложен Hallvard Vassbotn, а более новый - Barry Kelly. Оба подхода должны быть работоспособными.

Вывод:

Для разработчиков, использующих Delphi 5 и сталкивающихся с необходимостью преобразования интерфейса в реализующий класс, рекомендуется использовать методы, предоставляемые библиотекой JEDI или реализовать у объекта интерфейс IObject для получения доступа к объекту через метод GetSelf. Эти подходы позволяют обойти ограничения, связанные с не возможности изменения интерфейса.

Создано по материалам из источника по ссылке.

Вопрос связан с необходимостью преобразования указателя интерфейса в указатель на реализующий класс в среде разработки Delphi 5, чтобы получить доступ к новым свойствам, не затрагивающим сам интерфейс.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Интерфейс ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-10 17:44:25/0.003615140914917/0