我需要访问一个受严格保护的属性,因为我需要创建一个验证(基于此属性的值)以避免出现错误。(我没有具有此属性的第三方类的源代码)只有我有类(接口)和 dcu 的定义(所以我无法更改属性可见性)。问题是存在访问严格受保护属性的方法吗?(我真的阅读了Hallvard Vassbotn 博客,但我没有找到关于这个特定主题的任何内容。)
问问题
4954 次
2 回答
23
这个类助手示例编译得很好:
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
or成员。strict protected
在上面的示例中,说明了对私有成员的访问。下面显示了一个可以访问严格受保护成员的工作示例。
function TMyClassHelper.GetMyProtectedProp: Integer;
begin
with Self do Result:= MyProtectedProp; // Access strict protected property
end;
于 2011-11-30T17:56:48.537 回答
16
您可以使用标准protected
hack 的变体。
单元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;
严格保护只允许您从定义类和子类访问成员。因此,您必须在破解类上实际实现一个方法,将其公开,并将该方法用作进入目标严格受保护成员的路由。
于 2011-11-30T17:16:12.713 回答