mixinもどき

http://d.hatena.ne.jp/shinichiro_h/20040518#p1

コンパイル言語ではアスペクト指向の言語以外ではなかなか無い、よね。

もどきでよければ、Delphi8にはclass helperなるレッサーMixJuice機能が。

type
  Mixin_A = class helper for TObject
    function Greater(Other: TObject): Boolean;
    function Lesser(Other: TObject): Boolean;
  end;

function Mixin_A.Greater(Other: TObject): Boolean;
begin
  Result := (Self as IComparable).CompareTo(Other) > 0
end;

function Mixin_A.Lesser(Other: TObject): Boolean;
begin
  Result := (Self as IComparable).CompareTo(Other) < 0
end;

...

type
  TMyClass = class(TObject, IComparable)
    Value: Integer;
    function CompareTo(obj: TObject): Integer;
  end;

function TMyClass.CompareTo(obj: TObject): Integer;
begin
  Result := Self.Value - (obj as TMyClass).Value
end;

...

type
  //仮に他のclass helperが有効な時でも、こんな風にMixin_AをTMyClassに対して再選択できる
  Mixin_A_Intro = class helper(Mixin_A) for TMyClass
  end;

var
  A, B: TMyClass;
begin
  A := TMyClass.Create;
  B := TMyClass.Create;

  A.Value := 100;
  B.Value := 200;

  WriteLn(A.Greater(B)); //False

  ReadLn
end.

前に書いたように、同時にふたつ使えないという致命的に使いにくい点こそありますが、本来class helperは強力なんです。
そして前は書かなかったのですが、class helperの継承宣言だけで簡単に再選択ができるので、使用箇所を別スコープに抜き出して個別に扱えば、かなーり面倒ですけど複数使用もどーにかなっちゃいそうな気はしてるんです。

使いどころは相当難しそうではありますが…。ある程度粒度を大きく取らないと型ばかり増えて旨味が無さげ。でも強力なのは間違い無いです。後は使い方。いい使い方が思いつかないだけで…
だからそこ、負のニュアンスっぽくリンクされてますが、誤解しないでいただけたら幸いです。

…Dを見る時の目よりも甘いですかね?