[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: [jfriends] Re: Serializableインタフェース




前橋です。

遠藤さん:
>>もし、ClonableやSerializableが、
>>
>>  「デフォルトの実装を持ったインタフェース」
>>
>>だったとしたら、clone はClonableに付ければいいし、readObject
>>やwriteObjectはSerializableに付ければいいわけです。Objectの
>>メソッドにしたり、リフレクション使って無理矢理呼び出すのに比
>>べれば、はるかに自然です。
>
>この辺の議論はJavaHouse MLでかなりありましたよ。
>トピックスから読むとたくさん読めると思います。

ありがとうございます。最近時間がないんですが、あとで見ようと
思います。

>逆にアクセッサーを書くときは空しいです。
>このMLで出たJavaの拡張案では、
>予約語に property と read と write を追加するというのがありました。

そのプロパティが、リフレクションがそうであるように、「名前か
らの実行時検索」になっていなければ良いのですが。実行時検索は、
効率の問題もさることながら、コンパイル時にエラーが検出できな
いという欠点があります。

アクセサは、setterの方は、そもそもそんなに沢山あっちゃいかん
と思うので、メソッドを書いてもいいと思います。getterは、デー
タフィールドについては、デフォルトで、クラス外からは左辺値を
持たない式として扱う、という方法が考えられますが、データメン
バを「readonly」にしても、それがポインタであった場合、そのポ
インタの指す先は readonly にならないわけで... これはアクセサ
書いても同じことですね。

>>Cで、関数へのポインタを使うようなところは、Javaでは、メソッ
>>ドオーバライドで実現したり、インタフェースで実現したり、だと
>>思います。
>
>オーバーライドで実現している例が思い浮かばないのですが
>たとえばどんなときでしょう。

たとえば、ウィンドウシステムにおけるイベントの処理は、UNIXと
CとXt(Motifとか)で組むときには、関数へのポインタを使います。

JDK1.0では継承を使いました。JDK1.1ではインタフェースになって
います。

Cには、そもそもメソッドオーバライドなんていう器用な機能は存
在していないので、GUIのウィジェット(Javaでいうところの
Component)の継承構造も、関数へのポインタ(変数)を駆使して実現
しています。

私が、Cで最初に「関数へのポインタ」を使ったのは(かれこれ6年
ぐらい前かな)、お絵描きプログラムのようなプログラムで、
Canvas上で発生するマウスイベントを、現在実行中のコマンドに合
わせて振り分ける機構を実現したときでした。

たとえば、Appletのinit等のメソッドも、ブラウザはAppletのinit
を呼んでるだけなのですから、「実行時に、コールするメソッドを
切り替えるという意味からすれば」関数ポインタ的と言えるのでは
ないかと。

関数へのポインタの配列によるディスパッチテーブルって、インタ
フェースで書いても書けますが、たいてい、ディスパッチされる側
は、対等な(兄弟関係にすべき)オブジェクトなので、継承で書く方
が自然なことも多いと思います。

------------------------------------------------------------
  前橋 和弥                             maebashi@xxxxxxxxxx
  中部ソフトエンジニアリング(株)
    〒450 名古屋市中村区名駅4-10-25(名駅IMAIビル 5F)
    Tel:(052)583-4511(代) 内線 252 Fax:(052)583-4566
------------------------------------------------------------