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を見る時の目よりも甘いですかね?