疑似フレンド化
Unit Friend の続きです。
クラスの継承
当然ながら Delphi はクラスを継承できます。
type
TFoo = class
protected
FBar: String;
end;
// Foo を継承
// Protected メンバーの FBar にアクセス出来る
TBaz = class(TFoo)
end;
Unit Friend を悪用?しよう
前の記事で Unit Friend で、private / protected なメンバーは同一ユニット内からアクセス出来ると紹介しました。
ここで、クラスの継承と組み合わせると…
protected メンバを持つ TFoo クラスを定義して
type
TFoo = class
protected
FBar: String;
end;
TFoo を継承したクラスを定義すると
uses
unit1;
type
TOpenFoo = class(TFoo)
end;
var
Foo: TFoo;
begin
Foo := TFoo.Create;
// キャストするとアクセスできちゃう!
Writeln(TOpenFoo(Foo).FBar);
end.
Unit Friend の機能があるため、キャストしただけで protected メンバーにアクセス出来ちゃう!!
疑似フレンド
type
TOpenXXX = class(XXX) end;
として定義されたクラスを用いて protected メンバーにアクセスする技を「疑似フレンド化」というみたいです。
偽物の友情っぽくていいですね!!
@pik @ktz_alias メーリングリストの過去ログを読んでいたら「擬似 friend 化」という言い回しがあって、わりとしっくりきました。
— suno (すの) (@suno88) 2017年5月24日
なお、通例として疑似フレンド化させるクラスは Open を頭に付けるようです。
VCL 等のライブラリ内部でもよく使われるテクニックなので、ドッタンバッタン大騒ぎしなくても安心して使えます。
まとめ
電車の中とかで、Delphi の話をしているときに「疑似フレンド化」なんて言葉が出てきたら、一般的な用語である「親が子を殺す」等と相まって、大変殺伐とした印象を与えられてグッドだと思いました。