Search code examples
delphiclass-helpers

How do I use class helpers to access strict private members of a class?


This is a follow-up question to: How to hide a protected procedure of an object?
(I'm a bit fuzzy on the whole class helper concept)

Suppose I have an class like:

type 
TShy = class(TObject) 
strict private
  procedure TopSecret;
private
  procedure DirtyLaundry;  
protected 
  procedure ResistantToChange;
end; 

I know I can access the private method if I have the source code by adding a descendent class in the same unit.

I have 2 questions:
- How do I employ a class helper to access the strict private member?
- Can I use a class helper in a separate unit to access (strict) private members?


Solution

  • Up to, and including Delphi 10.0 Seattle, you can use a class helper to access strict protected and strict private members, like this:

    unit Shy;
    
    interface
    
    type
      TShy = class(TObject)
      strict private
        procedure TopSecret;
      private
        procedure DirtyLaundry;
      protected
        procedure ResistantToChange;
      end;
    

    unit NotShy;
    
    interface
    
    uses
      Shy;
    
    type
      TNotShy = class helper for TShy
      public
        procedure LetMeIn;
      end;
    
    implementation
    
    procedure TNotShy.LetMeIn;
    begin
      Self.TopSecret;
      Self.DirtyLaundry;
      Self.ResistantToChange;
    end;
    
    end.
    

    uses
      ..., Shy, NotShy;
    
    procedure TestShy;
    var
      Shy: TShy;
    begin
      Shy := TShy.Create;
      Shy.LetMeIn;
      Shy.Free;
    end;
    

    However, starting with Delphi 10.1 Berlin, this no longer works! Class helpers can no longer access strict protected, strict private or private members. This "feature" was actually a compiler bug that Embarcadero has now fixed in Berlin. You are out of luck.