delphi - कक्षा के सख्त निजी सदस्यों तक पहुंचने के लिए मैं कक्षा सहायकों का उपयोग कैसे करूं?




class-helpers (2)

यह एक फॉलो-अप प्रश्न है: किसी ऑब्जेक्ट की संरक्षित प्रक्रिया को कैसे छिपाना है?
(मैं पूरी कक्षा सहायक अवधारणा पर थोड़ा अस्पष्ट हूं)

मान लीजिए मेरे पास एक वर्ग है:

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

मुझे पता है कि अगर मैं एक ही इकाई में एक वंश वर्ग जोड़कर स्रोत कोड प्राप्त करता हूं तो मैं निजी विधि तक पहुंच सकता हूं।

मेरे पास 2 प्रश्न हैं:
- strict private सदस्य तक पहुंचने के लिए मैं कक्षा सहायक कैसे काम करूं?
- क्या मैं निजी सदस्यों तक पहुंचने के लिए एक अलग इकाई में कक्षा सहायक का उपयोग कर सकता हूं?


डेल्फी 10.0 सिएटल समेत, आप strict protected और strict private सदस्यों तक पहुंचने के लिए एक कक्षा सहायक का उपयोग कर सकते हैं, जैसे:

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;

हालांकि, डेल्फी 10.1 बर्लिन से शुरू, यह अब काम नहीं करता है ! कक्षा सहायक अब strict protected , strict private या private सदस्यों तक नहीं पहुंच सकते हैं। यह "फीचर" वास्तव में एक कंपाइलर बग था जिसे एम्बरकेडेरो अब बर्लिन में तय कर चुका है। आप भाग्य से बाहर हैं।


class helpers साथ class helpers private और strict private सदस्यों तक पहुंच डेल्फी 10.1 बर्लिन में हटा दी गई थी। क्लास हेल्पर्स प्राइवेट एक्सेस लोफोल को बंद करना देखें।

लेकिन अभी भी एक खुली छेड़छाड़ है:

unit Shy;

interface

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

implementation

procedure TShy.DirtyLaundry;
begin
  WriteLn('DirtyLaundry');
end;

procedure TShy.ResistantToChange;
begin
  WriteLn('ResistantToChange');
end;

procedure TShy.TopSecret;
begin
  WriteLn('TopSecret');
end;

end.
Program TestClassHelpers;

{$APPTYPE CONSOLE}

Uses
  Shy;

type
  TNotShy = class helper for TShy
  public
    procedure LetMeIn;
  end;

procedure TNotShy.LetMeIn;
var
  P : procedure of object;
begin
  TMethod(P).Code := @TShy.TopSecret;
  TMethod(P).Data := Self;
  P; // Call TopSecret
  TMethod(P).Code := @TShy.DirtyLaundry;
  TMethod(P).Data := Self;
  P; // Call DirtyLaundry;
  Self.ResistantToChange;  // Protected access works without problems
end;

var
  myObj: TShy;
begin
  myObj := TShy.Create;
  try
    myObj.LetMeIn;
    ReadLn;
  finally
    myObj.Free;
  end;
end.




class-helpers