Вопрос, поднятый в данной статье, касается доступа к строго приватным переменным класса в Delphi, которые объявлены как class var. В стандартном подходе такие переменные не доступны напрямую извне класса, что создаёт определённые трудности при необходимости их использования.
Проблема
Рассмотрим пример класса TFoo, в котором есть строго приватная переменная Foo, объявленная как class var:
type
TFoo = class
strict private class var
Foo: Integer;
public
constructor Create;
end;
В конструкторе класса TFoo происходит инициализация переменной Foo значением 666.
constructor TFoo.Create;
begin
inherited;
Foo := 666;
end;
Попытка получить значение переменной Foo через функцию GetFooValue, которая использует смещение к переменной, успешна только в случае, если переменная объявлена как обычная приватная, а не как class var:
function GetFooValue(const AClass: TFoo): Integer;
begin
Result := PInteger(PByte(AClass) + 4)^;
end;
Решение
Для доступа к строго приватным переменным класса, объявленным как class var, можно использовать класс-помощник (class helper). Пример реализации:
type
TFoo = class
strict private class var
Foo: Integer;
end;
TFooHelper = class helper for TFoo
private
function GetFooValue: Integer;
public
property FooValue: Integer read GetFooValue;
end;
function TFooHelper.GetFooValue: Integer;
begin
Result := Self.Foo; // Доступ к переменной через Self
end;
function GetFooValue(F: TFoo): Integer;
begin
Result := F.FooValue; // Используем свойство FooValue класса-помощника
end;
Теперь, даже не имея исходного кода класса TFoo, можно получить доступ к переменной Foo через свойство FooValue.
Альтернативный ответ
Доступ к переменным, объявленным как class var, не может быть реализован путём использования указателя на экземпляр класса и смещения, так как они реализованы как глобальные переменные. В случае, если необходимо получить доступ к такой переменной извне класса, следует рассмотреть возможность объявления класса свойства, которое будет ссылаться на эту переменную как на свою внутреннюю переменную для хранения значений.
Заключение
Использование класса-помощника является законным и безопасным способом обхода ограничений доступа к строго приватным переменным класса, объявленным как class var, даже если исходный код класса недоступен. Это позволяет расширять функциональность класса, не внося изменений в его исходный код.
Вопрос касается способов обхода ограничений доступа к строго приватным переменным класса, объявленным как `class var` в языке программирования Delphi, с использованием класса-помощника.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.