Как получить доступ к значению класса var, используя адрес класса и смещение переменной? - PullRequest
4 голосов
/ 19 декабря 2011

Мне нужно получить доступ к строгому закрытому классу 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 ]

7 голосов
/ 19 декабря 2011

Для доступа к строгому приватному классу 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.

Обновлен пример, чтобы соответствовать вопросу.

2 голосов
/ 19 декабря 2011

Вы действительно не можете сделать это таким образом.Класс var реализован как глобальная переменная , и его местоположение в памяти не имеет предсказуемой связи с местоположением класса VMT (на что указывает ссылка на класс), которое находится в константные данные область памяти вашего процесса.

Если вам нужен доступ к этой переменной извне класса, объявите class property, который ссылается на нее как на вспомогательное поле.

...