Мне нужно получить доступ к строгому защищенному свойству, потому что мне нужно создать проверку (основанную на значении этого свойства), чтобы избежать ошибки. (У меня нет исходного кода стороннего класса, у которого есть это свойство), только у меня есть определение класса (интерфейса) и dcu (поэтому я не могу изменить видимость свойства). Вопрос: существует ли способ доступа к строго охраняемой собственности? (Я действительно читал блог Hallvard Vassbotn, но я не нашел ничего об этой конкретной теме.)
Доступ к строго защищенному свойству класса Delphi?
Ответ 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 позволяет вам получить доступ к члену из определяющего класса и подклассов. Таким образом, вы должны фактически реализовать метод в классе взлома, сделать его общедоступным и использовать этот метод в качестве маршрута в целевом строго защищенном члене.