Python 弾丸ツアー /Java: JavaBeans 準拠 ... step 2: クラスを定義する
Python.use(better); Python 弾丸ツアー /Java: JFC/Swing 編
>>> JavaBeans 準拠
step 2: TIPS 継承から委譲へ
《Python3.1|Jython2.5|IronPython2.6》
step 2: ボタンを利用する
■ 継承から委譲へ
 ̄既存のコンポーネント(部品)を再利用するために、継承に代えて委譲を導入します。
## ---------------------------------------- step4 class Tips(object): def __init__(self, master, *args, **keys): pane = JPanel() button = JButton( text = "Click Me", preferredSize = (210,50), actionPerformed = self.actionPerformed, ) pane.add(button) master.contentPane = pane master.pack() def actionPerformed(self, e): # ActionListener comp = e.source comp.text = "%s"%ctime() def tips(): frame = JFrame( title = "Timer", defaultCloseOperation = JFrame.EXIT_ON_CLOSE, ) Tips(master = frame) frame.visible = True tips()
 ̄継承に代えて委譲を導入するための、リファクタリングを実施します。step3 では、
## ---------------------------------------- step3 class Tips(JPanel): def __init__(self, *args, **keys): ... self.add(button)
継承元の親クラス JPanel に代えて、自身 self に部品 button を追加していましたが、step4 では、
## ---------------------------------------- step4 class Tips(object): def __init__(self, master, *args, **keys): pane = JPanel() ... pane.add(button)
委譲先の JPanel インスタンス pane を用意して、これに部品 button を追加します。さらに、
class Tips(object): def __init__(self, master, *args, **keys): ... def tips(): ... Tips(master = frame)
クラス呼び出しのときに、キーワード引数 master= を利用して、委譲先の JPanel インスタンス pane を保持するフレームを指定する必要があります。
《TIPS》継承から委譲へ:
 ̄既存のコンポーネント(部品)を再利用するときには、2つの戦略が考えられます。一方は「継承」によって「部品を拡張する」もので、他方は「委譲」によって「部品を組み込む」ものです。
・継承は「ホワイトボックス型の再利用」とも呼ばれ、利用者は継承元のクラスに対して「直接アクセス」が許されます。何をしても自由であるのと引き換えに、利用者には自己責任が問われます。
・委譲は「ブラックボックス型の再利用」とも呼ばれ、利用者は委譲先のクラスに対して「間接アクセス」しか許されません。自由が制約されるのと引き換えに、利用者には安全性が確保されます。 ̄たとえば、Tips に対して新たな JButton を追加することを考えます。継承に基づく Tips は JPanel でもあるので、後から部品を追加できます。Tips を「ホワイトボックス」と見なすので、利用者には JPanel の存在が露呈します。委譲に基づく Tips は JPanel ではないので、後から部品を追加できません。Tips を「ブラックボックス」と見なすので、利用者には JPanel の存在が露呈しません。継承は、不正アクセスにも通じますが、委譲にすると、この問題を回避できます。
>>> do(3) >>> # -------------------------------------------------- step3 >>> Qtips3.add(JButton("oops"))>>> do(4) >>> # -------------------------------------------------- step4 >>> Qtips4.add(JButton("oops")) Traceback (most recent call last): File "", line 1, in AttributeError: 'Tips' object has no attribute 'add'
↑TOP
》作業中です《