Swanman's Horizon

性欲をもてあましつつなんらかの話をするよ。

プロパティのオーバーロード。

本来同名で複数定義することのできないプロパティを、default指定した場合に限りオーバーロードできちゃう、という小ネタ。

type
  TFoo = class
  private
    function GetItem(Index: Integer): string; overload;
    function GetItem(const Name: string): string; overload;
  public
    property Items[Index: Integer]: string read GetItem; default;
    property Items[const Name: string]: string read GetItem; default;
  end;

上のように定義しておくと、こんな風に使える。

var
  foo: TFoo;
  s: string;
begin
  foo := TFoo.Create;
  s := foo[0];
  s := foo['bar'];
end;

元ネタ(後述)の方ではアクセッサは別名にしてたけど、上記のように同じ名前でもOK。ちなみにクラスプロパティも同名にできるのでさらにカオス!と思ってたんだけど、コンパイルは通るのに実行するとエラーになるし、そもそもTFoo['bar']という書き方ができないんだよね。配列型が必要って怒られる。

どうでもいいけど新しめの機能って、コンパイルは通るのに実行時エラーとか、構文チェックは通らないのにコンパイルと実行は可能とか、ちぐはぐな場面が多い気がする。ちゃんとチェックしてくれ。

元ネタ

みんな大好きHallvard's Blogから。しかも2年以上前のネタ。他のDelphi使いには「今さら…」かもしれないけど、自分の中でのDelphiは最近までバージョン6で止まってた*1のでこういったネタでも結構新鮮だったりする*2

それにしてもこのオーバーロードネタといい、周知が足りなさすぎると思うんだ。前も書いた気がするけどDelphi 7以降の言語およびコンパイラの新機能はある程度目玉な機能しか載ってなくて、こういう細かくて何気に便利かもしれない新機能に全く触れられてないんだよね。いっそ俺に書かせろと言いたいくらい。本当に書かせられることになったらそれはそれで面倒なので、決してそんなことは言わないけど。

というかあれだよ!エンバカから給料もらってるやつが書け!書け!

*1:2006はあったけどほとんど黒歴史扱い

*2:ただしこの記事は2010を買ってすぐの頃に殴り書きしたものを元にしてるので、今はそこまで…