いろいろ実験していたのですが、
Delphi8辺りから導入された class helperが結局のところ使えない件。
(今更ですけどw)
簡単に言うと、2つ以上の class helper が同時に適用できない。
コード:
実行結果:
Count = 3 All = Hoge in test, Moge in test, Mage in test, Hit RETURN key!!
上記のコードの場合、
TListTestClassHelper だけが適用され、
TAspectClassHelper が適用されない。
class helperをそれぞれ各ユニットに分けた場合、
usesした順序でどれが適用されるかが決定されます。
う、うーむ。
いざと言うときに困る仕様だなー。
まあ、当初から言われていた不都合だけども。
もし複数class helper適用が可能ならば、
Ruby並みの mixin が可能な柔軟性を秘めるのですが……。
……でも、実は、
すでに似たようなことはできるんです!
必殺型キャスト!
実行結果:
start - TStringList.Add(Hoge) end - TStringList.Add start - TStringList.Add(Moge) end - TStringList.Add Count = 3 All = Hoge, Moge, Mage in test, Hit RETURN key?
……できてない('A`)
型指定していてダックタイピングぽくなってないし、
こんなの mixin とか言ったら怒られる。
それに同じメソッド(add();)を拡張しようとしても、
2つ同時に適用はできてない。
(そもそも、型安全じゃない件)
全然ダメダメなオチだなあ。
次回は、そろそろ Delphi2009 について語ってみたいところだけど……。
カテゴリ: [ Delphi ]
コメント (6)
class helperは、そもそも仮想関数を追加できないと、単にProc(Obj)かObj.Procかの記法の違いでしかありませんし……。
もしDelphi 2009を買われたのでしたら、是非是非Win32でclass helperで仮想関数を追加できるか試していただけないでしょうか。
(Delphi 2007までは、.NETでは可能でしたがWin32ではダメでした)
投稿者: YT | 2008年09月25日 23:44
日時: 2008年09月25日 23:44
YTさんこんにちは。
すいません、まだDelphi 2009は買ってないのです。
実は、VS.net2008 Proへのアプデートと天秤にかけてまして正直迷ってます。
今までの経験上、2009はどうみてもstableじゃなくて、傾向からバグが結構ある版(有償アップデートで2010か、2011がstable)だとわかってるとどうも、スルーすべきかと思ってしまうものです。
結局申し込んどいてフィールドテスト参加できなかったくだりはまた次回に(発売前に少しでもバグ取り参加できなかったのは悔やまれる……)。
問題は、Delphi2009のスペックだけ見たらかなりほしいのですが、バグがなくなったとしても、最近、そのスペックでもC#とのアドバンテージがあまりないことに気づき始めている点です。F#やら.net界隈がやたら面白そうに見えるものです。
Delphiは以前と違ってお布施感覚で買う意思がなくなっています。
うーんこの辺一回まとめてエントリーにしときたい。
class helperは確かに直近のヘルパーでキャストしているだけーな気がします。
しかし、class helperで仮想関数!?はどうなんでしょうか?
どういう応用ができるのか気になります。
投稿者: TOBY | 2008年09月26日 22:12
日時: 2008年09月26日 22:12
あら、先走ってしまいました。すみません。
(Delphi 2009は、私も当面様子見です。TObject.InstanceSize = 8といい、長い文字列が静的に解決できそうなコードページetcまでデータとして持つようになったことといい、クロージャがクラスと同等のRTTIを持つことといい、メモリーを節約する意識が……)
それで、class helperで仮想関数を追加できると、よくある「DocumentクラスにDrawメソッド持たせるのか?」系の問題が解決できるのではと思ってます。汎用の基底クラスに特定アプリ専用の仮想関数を追加できることになりますから。
(あとVisitorパターンも綺麗になりそうな気がしているのですが、これはDelphi.NETで試したことがあるのですが上手くいってないです)
ちなみに複数のclass helperの使い分けは、http://d.hatena.ne.jp/ytqwerty/20040518#p1な感じでできましたです。
投稿者: YT | 2008年09月28日 11:06
日時: 2008年09月28日 11:06
> TObject.InstanceSize = 8
これ、前にYTさんのdiaryみて吹きました。
いやでも、ここにきてのアグレッシプな姿勢は私は評価していいのかなとw
個人的には、メモリー効率より、実行効率と開発効率を頼む……という感じです。
様子見の自分がいうのもなんですが。
Vistorパターンの件はこれですね。理解しました。
[Delphi] Visitorサポートをclass helperで後付け
http://d.hatena.ne.jp/ytqwerty/20060314#p1
そうか、派生クラスのhelperをそれぞれ定義してoverrideできるわけか……。
使い分けの件、URLの記事で理解できました。
スコープ内で優先したいのを継承すればいいだけの話かあ。
それよりも、interface使った応用がびびってしまいましたw
なんだかTObjectにhelper追加でinterface依存にしたら何でもありですね、これはー。
しかし、Delphi8のころにこんなコードをいきなり書いてらっしゃるとはw
class helperの応用は実験してみないといけないですが、
実践で使えそうなら(自分の中だけで)かなりのアドバンテージになりそうです。
投稿者: TOBY | 2008年09月29日 04:38
日時: 2008年09月29日 04:38
QualityCentralに以下が登録されてます
[Enable multiple helpers per type]
http://qc.codegear.com/wc/qcmain.aspx?d=67743
投稿者: anonymous | 2008年10月12日 00:21
日時: 2008年10月12日 00:21
ありがとう。voteしておきました。関係ないけどどうやったらレーティングできるんだろう
投稿者: TOBY | 2008年10月12日 10:49
日時: 2008年10月12日 10:49