LoginSignup
4
2

More than 5 years have passed since last update.

Delphi の疑似フレンド

Last updated at Posted at 2017-05-29

疑似フレンド化

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 クラスを定義して

unit1.pas
type
  TFoo = class
  protected
    FBar: String;
  end;

TFoo を継承したクラスを定義すると

unit2.pas
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 メンバーにアクセスする技を「疑似フレンド化」というみたいです。
偽物の友情っぽくていいですね!!

なお、通例として疑似フレンド化させるクラスは Open を頭に付けるようです。
VCL 等のライブラリ内部でもよく使われるテクニックなので、ドッタンバッタン大騒ぎしなくても安心して使えます。

まとめ

電車の中とかで、Delphi の話をしているときに「疑似フレンド化」なんて言葉が出てきたら、一般的な用語である「親が子を殺す」等と相まって、大変殺伐とした印象を与えられてグッドだと思いました。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2