インスタンスが属するクラスをあとから変更する操作をいろいろな言語で


id:sumim:20090121:p2 の続き。はたしてどんな言語にこの種の機能が備わっているのか興味を持ったので調べて書いてみることにしました。ただ、会社員と学生の例のままではワンニャン同様、そういうことが出来て何が嬉しいのかイメージしにくいと思うので、Common Lisp HyperSpecCHANGE-CLASS にある座標系変換の例に変えましょう。こちらのほうが、シンプルなまま要点を押さえていてよさそうかなと。


念のため概要と条件を書いておきますと、手順としては、

  • 直交座標系(cartesian)と極座標系(polar)という二つのクラスを定義
  • 極座標系のインスタンスを生成後、それが属するクラスを直交座標系に変更
  • (おまけで)ふたたび極座標系に

という操作を行ない、その後、

  • 直交座標系クラスに属するようになったときに x や y の値も(変換されて)引き継がれているか?
  • あらかじめ別の変数にも関連づけしておいた同一オブジェクトも同様か?

を確認できて「クリア」としています。

前者は、実用面を考えるとこういうことがシンプルに実現できたほうがベターかな…という程度のデモンストレーションの意味合いですが、後者は、じつは別のオブジェクトを再代入しただけだった…という勘違いを避けるためのチェックなので必ず確認しておくほうがよいと思います。


とりあえず、思いつく範囲で SmalltalkCommon Lisp (CLOS)、Python だけを試しましたが、他に見つかれば順次追加してゆくつもりです。


追加分


他サイトから(多謝!)