Python 弾丸ツアー /Java: JavaBeans 準拠 ... step 2: クラスを定義する

OOPデザインパターンリファクタリング

Python.use(better); Python 弾丸ツアー /Java: JFC/Swing 編
>>> JavaBeans 準拠
step 2: ボタンを利用する
《Python3.1|Jython2.5|IronPython2.6》

《著》小粒ちゃん@湘南組《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/23 ● 第4版♪2010/03/08

step 2: クラスを定義する

■ クラスを定義する

Java では、クラスを定義するときに、

    public class Tips extends JPanel implements ActionListener {

親クラスを継承する extends と、インターフェースを実現する implements との違いを、区別する必要があります。Jython では、

    class Tips(JPanel, ActionListener):

これらの違いを区別する必要がありません。このとき、extends および implements は不要です。

■ イベントリスナーを登録する

Java では、リスナーを登録するときに、メソッド addActionListener を利用します。Jython でも、

    ## ---------------------------------------- step 0
    from java.awt.event import ActionListener

    class Tips(JPanel, ActionListener):
        def __init__(self, *args, **keys):
            ...
            button.addActionListener(self)

        def actionPerformed(self, e):       # ActionListener

のように記述できますが、便利な代用表現を利用すると、

    ## ---------------------------------------- step 1
    class Tips(JPanel):
        def __init__(self, *args, **keys):
            ...
            button.actionPerformed = self.actionPerformed

        def actionPerformed(self, e):       # ActionListener

インスタンス属性 actionPerformed を介して、呼び出し可能オブジェクトを管理できます。メソッドも呼び出し可能オブジェクトなので、ここに self.actionPerformed を登録できます。すると、イベントに呼応して、メソッド actionPerformed の本体に記述したコードの断片が実行されます。

《TIPS》イベントリスナー:

● actionPerformed
Jython が提供する、インスタンス属性 actionPerformed を利用すると、ActionListener を取り込む import 文や、クラスを定義するときに ActionListener を省略できます。すると、特定のインターフェース(ActionListener/addActionListener)には依存しない、共通のプロトコル(actionPerformed)だけで規定される、柔軟なコードを記述できます。□

■ getter

インスタンス属性を参照するのに、getter を利用します。たとえば、インスタンス属性 source を参照するときには、get の後に属性の名前を続けた、メソッド getSource が存在するものとします。このとき、get に続く最初の文字は大文字になります。すると、Java では、

    public void actionPerformed(ActionEvent e) {
        JButton comp = (JButton)e.getSource();

のようになりますが、Jython では、

        def actionPerformed(self, e):       # ActionListener
            comp = e.getSource()

のようにして、イベントが発生したコンポーネントを参照できます。さらに、Jython では、

        def actionPerformed(self, e):       # ActionListener
            comp = e.source

のようにして「インスタンス属性 source の値を参照している」かのような表現が可能になります。

TOP
》作業中です《