Доступ к строго защищенному свойству класса Delphi? - PullRequest
16 голосов
/ 30 ноября 2011

Мне нужно получить доступ к строгому защищенному свойству , потому что мне нужно создать проверку (основанную на значении этого свойства), чтобы избежать ошибки. (У меня нет исходного кода стороннего класса, который имеет это свойство), только у меня есть определение класса (интерфейса) и dcu (поэтому я не могу изменить видимость свойства). Вопрос в том, существует ли способ получить доступ к строго охраняемой собственности? (Я действительно читаю Блог Hallvard Vassbotn , но я не нахожу ничего особенного в этой конкретной теме.)

Ответы [ 2 ]

23 голосов
/ 30 ноября 2011

Этот пример вспомогательного класса хорошо компилируется:

type
  TMyOrgClass = class
  strict private
    FMyPrivateProp: Integer;
  strict protected
    property MyProtectedProp: Integer read FMyPrivateProp;
  end;

  TMyClassHelper = class helper for TMyOrgClass
  private
    function GetMyProtectedProp: Integer;
  public
    property MyPublicProp: Integer read GetMyProtectedProp;
  end;

function TMyClassHelper.GetMyProtectedProp: Integer;
begin
  Result:= Self.FMyPrivateProp;  // Access the org class with Self
end;

Дополнительную информацию о помощниках класса можно найти здесь: код-помощников-классов-используемых-в-разработке-новом-коде

Обновление

Начиная с Delphi 10.1 Berlin, доступ к private или strict private членам с помощниками класса не работает. Это считалось ошибкой компилятора и было исправлено. Доступ к protected или strict protected членам по-прежнему разрешен с помощью помощников класса.

В приведенном выше примере был показан доступ к приватному члену. Ниже показан рабочий пример с доступом к строго защищенному члену.

function TMyClassHelper.GetMyProtectedProp: Integer;
begin
  with Self do Result:= MyProtectedProp;  // Access strict protected property
end;
15 голосов
/ 30 ноября 2011

Можно использовать вариант стандартного protected хака.

Единица 1

type
  TTest = class
  strict private
    FProp: Integer;
  strict protected
    property Prop: Integer read FProp;
  end;

Единица 2

type
  THackedTest = class(TTest)
  strict private
    function GetProp: Integer;
  public
    property Prop: Integer read GetProp;
  end;

function THackedTest.GetProp: Integer;
begin
  Result := inherited Prop;
end;

Единица 3

var
  T: TTest;

....

THackedTest(T).Prop;

Строго защищен только позволяет получить доступ к члену из определяющего класса и подклассов.Таким образом, вам необходимо реализовать метод для класса взлома, сделать его общедоступным и использовать этот метод в качестве маршрута к целевому строго защищенному члену.

...