我需要修复第三方组件。该组件的类具有私有变量,该变量由其后代主动使用:
TThirdPartyComponentBase = class
private
FSomeVar: Integer;
public
...
end;
TThirdPartyComponent = class (TThirdPartyComponentBase)
protected
procedure Foo; virtual;
end;
procedure TThirdPartyComponent.Foo;
begin
FSomeVar := 1; // ACCESSING PRIVATE FIELD!
end;
这是有效的,因为两个班级都在同一个单元,所以他们有点“朋友”。
但是如果我尝试在新单元中创建一个新类
TMyFixedComponent = class (TThirdPartyComponent)
procedure Foo; override;
end;
我无法再访问 FSomeVar,但我需要使用它来进行修复。我真的不想在我的代码中重现所有基类树。
你能建议一些快速的技巧来访问该私有字段吗不改变原组件的单位如果有可能吗?
通过使用class helpers
可以从派生类完成对基类私有部分的访问,而不会失去类型安全性。
只需在另一个单元中添加这些声明即可:
Uses YourThirdPartyComponent;
type
// A helper to the base class to expose FSomeVar
TMyBaseHelper = class helper for TThirdPartyComponentBase
private
procedure SetSomeVar( value : integer);
function GetSomeVar: integer;
public
property SomeVar:integer read GetSomeVar write SetSomeVar;
end;
TMyFixedComponent = class helper for TThirdPartyComponent
protected
procedure Foo;
end;
procedure TMyFixedComponent.Foo;
begin
// Cast to base class and by the class helper TMyBaseHelper the access is resolved
TThirdPartyComponentBase(Self).SomeVar := 1;
end;
function TMyBaseHelper.GetSomeVar: integer;
begin
Result := Self.FSomeVar; // ACCESSING PRIVATE FIELD!
end;
procedure TMyBaseHelper.SetSomeVar(value: integer);
begin
Self.FSomeVar := value; // ACCESSING PRIVATE FIELD!
end;
// Testing
var
TSV: TThirdPartyComponent;
begin
TSV := TThirdPartyComponent.Create;
try
TSV.Foo;
WriteLn(IntToStr(TSV.SomeVar)); // Writes 1
finally
TSV.Free;
end;
end.
从代码中的注释可以看出,FSomeVar
是由类助手暴露的TThirdPartyComponentBase
班级。
另一个班级助手TThirdPartyComponent
实现 Foo 过程。在那里,可以访问SomeVar
基类助手的属性是通过类型转换为基类来实现的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)