Доступ к строго защищенному свойству класса Delphi?

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

Ответ 1

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

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;

Более подробную информацию о помощниках классов можно найти здесь: should-class-helpers-be-used-in-developing-new-code

Обновление

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

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

function TMyClassHelper.GetMyProtectedProp: Integer;
begin
  Result:= Self.MyProtectedProp;  // Access strict protected property
end;

Ответ 2

Вы можете использовать вариант стандартного взлома 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;

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