《余録》継承の隘路 - 委譲との比較
Java プログラマーのための Python 導入ガイド《記事一覧》
《余録》 継承の隘路 - 委譲との比較
《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2009/04/03
■ 概要
特殊メソッドを利用した「継承」による実現と「委譲」による実現とを比較検討をします。
OOP の黎明期には脚光を浴びた継承も、やがて、さまざまな問題点が指摘されることになります。 その反省から、継承から委譲へとパラダイムシフトが起こりますが、では継承は「必要悪」なのでしょうか。 継承は「必要悪」委譲は「救世主」とするステレオタイプには「再」再考の余地があります。 《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。
■ 関連記事
- GoF を反面教師に, Adaptor
- 《余録》継承は必要悪か __getattribute__
参考文献 | note |
---|---|
JavaプログラマのためのUML活用ガイド―例題に学ぶオブジェクト指向プログラミング設計
|
「継承」の問題を回避するために「委譲」を活用する方法を紹介しています。 |
〈GoF〉Adapter
java.util.Vector を使って実現していながら、組み込み型 list と同様に扱えるようになります。
■ 継承
クラス ilist は、java.util.Vector を継承していながら、メソッド append/remove 以外をすべて無効にします。
class ilist(Vector): def __getattribute__(self, name): dirs = { "append": "addElement" , "remove": "removeElement", } name = dirs.get(name) if not name: raise AttributeError return Vector.__getattribute__(self, name)
特殊メソッド __getattribute__ は、任意の属性へのアクセスを横取りして、ドット「.」による値の参照/変更、メソッド呼び出しなどを自由に制御できます。
■ 委譲
クラス ilist は、java.util.Vector に委譲することで、メソッド append/remove 以外をすべて無効にします。
class hlist(object): def __init__(self, items): self.items = Vector(items) def __repr__(self): return repr(self.items) def __getattr__(self, name): dirs = { "append": "addElement" , "remove": "removeElement", } name = dirs.get(name) if not name: raise AttributeError return getattr(self.items, name)
特殊メソッド __getattr__ は、任意の属性へのアクセスを横取りして、ドット「.」による値の参照/変更、メソッド呼び出しなどを自由に制御できます。
Tips
》作業中です《
Last updated♪09/06/04