他クラスのprotectedのデータにアクセスする方法

Delphi 6 プログラミングバイブル』で紹介されていた、他クラスのprotectedのデータにアクセスする方法。

例として次のようなクラスがある。

//Unit1
type
  TTest = class
  public
    PublicData: Integer;
    function GetValue(): String;
  protected
    ProtectedData: Integer;
  end;

implementation

function TTest.GetValue: String;
begin
  Result := Format('Public: %d, Protected: %d',
    [PublicData, ProtectedData]);
end;

protectedであるメンバ変数ProtectedDataには、他のクラスからはアクセスできない。

program Project1;

uses
  SysUtils,
  Unit1 in 'Unit1.pas';
var
  obj: TTest;
begin
  obj := TTest.Create;
  obj.PublicData := 1;
  obj.ProtectedData := 2; //コンパイルエラー。アクセスできない

Delphi 6 プログラミングバイブル』で紹介されている方法を使うと、このprotectedのメンバ変数にアクセスできる。

方法は簡単だ。

まず、TTestクラスを継承したクラスを新たに作成する。

type
  TFake = class (TTest);

そして、作成した新しいクラスにキャストして、protectedのメンバ変数にアクセスする。

type
  TFake = class (TTest);
var
  obj: TTest;
begin
  obj := TTest.Create;
  obj.PublicData := 1;
  //obj.ProtectedData := 2; //コンパイルエラー。アクセスできない
  TFake(obj).ProtectedData := 2; //キャストするとアクセスできた!
  Writeln(obj.GetValue());

実行結果

Public: 1, Protected: 2

ちゃんと値が変更されている。
protectedのメンバ変数にアクセすることができた。

テストプログラムなどでは、役に立ちそうなテクニックだ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください