gpt4 book ai didi

Delphi:写入后代类中私有(private)祖先的字段

转载 作者:行者123 更新时间:2023-12-03 14:39:35 25 4
gpt4 key购买 nike

我需要修复第三方组件。该组件的类具有私有(private)变量,该变量由其后代主动使用:

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;

这是有效的,因为两个类(class)都在同一个单元,所以他们有点“ friend ”。

但是如果我尝试在新单元中创建一个新类

TMyFixedComponent = class (TThirdPartyComponent)
procedure Foo; override;
end;

我无法再访问 FSomeVar,但我需要使用它来进行修复。我真的不想在我的代码中重现所有基类树。

如果可能的话,您能否建议一些快速的技巧来访问该私有(private)字段而不更改原始组件的单位

最佳答案

通过使用类帮助器,可以实现从派生类访问基类的私有(private)部分,而不会失去类型安全性。

只需在另一个单元中添加这些声明即可:

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.

从代码中的注释可以看出,FSomeVarTThirdPartyComponentBase 类中的类帮助程序公开。TThirdPartyComponent 的另一个类帮助器实现了 Foo 过程。在那里,通过类型转换到基类来访问基类助手的 SomeVar 属性。

关于Delphi:写入后代类中私有(private)祖先的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4043501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com