在Delphi 10 Seattle中,我可以使用以下代码来解决过于严格的可见性限制.
如何访问私有变量?
type
TBase = class(TObject)
private
FMemberVar: integer;
end;
Run Code Online (Sandbox Code Playgroud)
我如何访问普通或虚拟私有方法?
type
TBase2 = class(TObject)
private
procedure UsefullButHidden;
procedure VirtualHidden; virtual;
procedure PreviouslyProtected; override;
end;
Run Code Online (Sandbox Code Playgroud)
type
TBaseHelper = class helper for TBase
function GetMemberVar: integer;
Run Code Online (Sandbox Code Playgroud)
在Delphi 10.1 Berlin中,类助手不再能够访问主题类或记录的私有成员.
是否有其他方式可以访问私人会员?
我已经阅读了这些问题和答案
但我不能弄清楚如何修补位于其他单元中的类的私有方法.
检查此示例我想修补Bar
程序.
Unit ThidParty;
Interface
Type
TFoo =Class
private
procedure Bar;
end;
Run Code Online (Sandbox Code Playgroud)
我认为关键是找到一种方法来获取私有方法的地址.
那么,我如何修补delphi类的私有方法?
特定
type
TMyClass = class
private
FPrivateInt : Integer;
protected
FProtectedInt : Integer;
public
FPublicInt : Integer;
end;
Run Code Online (Sandbox Code Playgroud)
在一个单位和
type
TMyHelper = class helper for TMyClass
function Sum : Integer;
end;
[...]
function TMyHelper.Sum: Integer;
begin
Result := 0;
Result := Result + FPublicInt;
Result := Result + FProtectedInt;
Result := Result + FPrivateInt; // <- compiler error here
end;
Run Code Online (Sandbox Code Playgroud)
在另一个,XE8编译器报告错误"E2003未声明的标识符'FPrivateInt'.这是我直观地预期的,因为在声明类的单元外部的私有成员的可见性受限,如果我没有看到示例Marco Cantu的Delphi 2007手册p89/90,访问"帮助"类的私人领域,并在接受的答案的开头段落中明确声明
这似乎支持它:"众所周知,帮助者确实破解了私人可见性.因此,私人成员可以从班级助手那里看到......"
那么,为什么我会收到E2003 Undeclared Identifier错误?在我的理解或代码中,我显然在某处遗漏了某些东西.我使用XE4和XE6,btw和XE4在我引用的SO答案之前得到了相同的错误,这是从去年开始的.
我仍然使用Delphi XE4(我使用多个Delphi编译器的最新编译器),并且需要一个特定的解决方法,因为他们在此版本中完全隐藏了TBasicAction中的FClients.我在设置启用/禁用时连接/断开客户端运行时(以避免使用~100 + actions和ui元素闪烁)因此XE4的此解决方法:
这是我天真的尝试,只是简单地回到了这个领域.
TmscBasicActionCrack = class(TBasicAction)
end;
{$IFDEF mymsDELPHIXE4}
TmscBasicActionHelper = class helper for TBasicAction
public
function Helper_Get_Private_FClients: TList<System.Classes.TBasicActionLink>;
end;
{$ENDIF}
{$IFDEF mymsDELPHIXE4}
//------------------------------------------------------------------------------
function TmscBasicActionHelper.Helper_Get_Private_FClients: TList<System.Classes.TBasicActionLink>;
begin
Result := Self.FClients;
end;
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)
但是,我收到错误
E2003未声明的标识符:TList <>
我必须承认,自从我最初听说稳定性问题+我需要保持与Lazarus/FreePascal的兼容性时,我永远不会使用Delphi中的泛型.
我知道最近的版本Delphi再次改变了类助手,但我现在最感兴趣的是让它与Delphi XE4一起使用