Delphi 如何访问受保护的类方法

Delphi 如何访问受保护的类方法,delphi,firemonkey,Delphi,Firemonkey,我们有这样一个基类: TCustomContextOpenGL = class(TContext3D) protected **class** procedure CreateSharedContext; virtual; abstract; end; 在程序中,要了解当前上下文类,我们需要: TContextManager.DefaultContextClass => return TContextClass = class of TContext3D; 例如,这将返

我们有这样一个基类:

TCustomContextOpenGL = class(TContext3D)
  protected
    **class** procedure CreateSharedContext; virtual; abstract;
  end;
在程序中,要了解当前上下文类,我们需要:

TContextManager.DefaultContextClass => return TContextClass = class of TContext3D;
例如,这将返回TCustomAndroidContext或TCustomContextIOS,它们覆盖CreateSharedContext,但让它受到保护

我的问题是我需要做些什么

TContextManager.DefaultContextClass.CreateSharedContext 

但这当然行不通,因为CreateSharedContext在TCustomContextOpenGL中受保护:(我该怎么办?

最好的办法是避免直接调用受保护的方法。如果它是第三方类,并且您无法更改它,那么您可以像任何其他受保护的类成员一样访问受保护的类方法

下面是如何访问受保护对象事件的示例:

访问受保护类方法的类似方法:

type
  TCustomContextOpenGLHack = class(TCustomContextOpenGL);
  CCustomContextOpenGLHack = class of TCustomContextOpenGLHack;

procedure Test;
begin
  CCustomContextOpenGLHack(TContextManager.DefaultContextClass).CreateSharedContext;
end;

最好的办法是避免直接调用受保护的方法。如果它是第三方类,并且您不能更改它,那么您可以像访问任何其他受保护类成员一样访问受保护类方法

下面是如何访问受保护对象事件的示例:

访问受保护类方法的类似方法:

type
  TCustomContextOpenGLHack = class(TCustomContextOpenGL);
  CCustomContextOpenGLHack = class of TCustomContextOpenGLHack;

procedure Test;
begin
  CCustomContextOpenGLHack(TContextManager.DefaultContextClass).CreateSharedContext;
end;

@AndreiGalatyn其实不一样,因为这里我讲的是类而不是对象:(这看起来更像是C++,而不是Delphi)。在回答你的问题时,你不能把它当作保护和访问它——这就是保护的目的,所以不要让它被保护,使它重写公共。基类仍然不能直接访问,但后裔类可以。你不能使用<代码> RegisterContextClasses < /代码>d
UnRegisterContextClasses
是的,我可以,但是对于我想做的一行代码使用registerContextClasses/UnRegisterContextClasses看起来太复杂了:(最后我使用了{$ifdef android}..{$else ifdef ios}..@AndreiGalatyn其实不一样,因为这里我讲的是类,而不是对象:(这看起来更像是C++,而不是Delphi)。在回答你的问题时,你不能把它当作保护和访问它——这就是保护的目的,所以不要让它被保护,使它重写公共。基类仍然不能直接访问,但后裔类可以。你不能使用<代码> RegisterContextClasses < /代码>d
UnRegisterContextClasses
是的,我可以,但是对于我想做的一行代码,使用registerContextClasses/UnRegisterContextClasses看起来太复杂了:(最后,我使用了{$ifdef android}…{$else ifdef ios}…,这不起作用,因为TContextManager.DefaultContextClass返回的不是对象,而是类(ie:TContext3D的类):(@andray:aaah像这样简单?:)好的,谢谢!这不起作用,因为TContextManager.DefaultContextClass返回的不是一个对象而是一个类(ie:TContext3D的类):(@andray:aaah像这样简单?:)好的,谢谢!