Как получить доступ к значению класса var, используя адрес класса и смещение переменной?
Мне нужно получить доступ к строгому закрытому значению класса var, используя его экземпляр и смещение переменной.
пока пробовал это, проверьте этот пример класса
type
TFoo=class
strict private class var Foo: Integer;
public
constructor Create;
end;
constructor TFoo.Create;
begin
inherited;
Foo:=666;
end;
//this function works only if I declare the foo var as
//strict private var Foo: Integer;
function GetFooValue(const AClass: TFoo): Integer;
begin
Result := PInteger(PByte(AClass) + 4)^
end;
Как видите, функция GetFooValue работает только тогда, когда переменная foo не объявлена как класс var.
Вопрос в том, как я должен изменить GetFooValue
для того, чтобы получить значение Foo
когда объявлен как strict private class var Foo: Integer;
2 ответа
Чтобы получить доступ к строгому приватному классу 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; // Access the org class with Self
end;
function GetFooValue( F : TFoo) : Integer;
begin
Result:= F.GetFooValue;
end;
Var f : TFoo;//don't need to instantiate since we only access class methods
begin
WriteLn(GetFooValue(f));
ReadLn;
end.
Обновленный пример, чтобы соответствовать вопросу.
Вы действительно не можете сделать это таким образом. Класс var реализован как глобальная переменная, и его расположение в памяти не имеет предсказуемой связи с расположением класса VMT (на что указывает ссылка на класс), который находится в области постоянных данных памяти вашего процесса.
Если вам нужен доступ к этой переменной извне класса, объявите class property
который ссылается на него как на свое вспомогательное поле.