『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のメンバ変数にアクセすることができた。
テストプログラムなどでは、役に立ちそうなテクニックだ。