《余録》継承の隘路 - 委譲との比較

Java プログラマーのための Python 導入ガイド記事一覧
《余録》 継承の隘路 - 委譲との比較

《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2009/04/03

■ 概要

特殊メソッドを利用した「継承」による実現と「委譲」による実現とを比較検討をします。

 OOP の黎明期には脚光を浴びた継承も、やがて、さまざまな問題点が指摘されることになります。
 その反省から、継承から委譲へとパラダイムシフトが起こりますが、では継承は「必要悪」なのでしょうか。
 継承は「必要悪」委譲は「救世主」とするステレオタイプには「再」再考の余地があります。

 《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。
■ 関連記事
参考文献 note
JavaプログラマのためのUML活用ガイド―例題に学ぶオブジェクト指向プログラミング設計

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