5

私のクラスは ActionListener を実装しています。以下のネストされたクラスを実装しました。

JMenuItem mntmNew = new JMenuItem("New...");
    mntmNew.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e){
            doNew(e); //calls to outer class for cleaner code
        }
    });
    mnFile.add(mntmNew);

    JMenuItem mntmLoad = new JMenuItem("Load...");
    mntmLoad.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e){
            doLoad(e); //calls to outer class for cleaner code
        }
    });
    mnFile.add(mntmLoad);

//etc. for the rest of the menu system

しかし、Eclipse は、クラスが継承された抽象メソッド ActionListener.actionPerformed(ActionEvent e) を実装する必要があることをまだ伝えています。このように入れ子になったクラスにオーバーライド メソッドを実装することはできませんか?

4

1 に答える 1

8

あなたの質問:

このように入れ子になったクラスにオーバーライド メソッドを実装することはできませんか?

答えはノーです。Eclipse (実際にはJava ) は、クラスが ActionListener を実装していると宣言しているときに、クラスのスコープ内で必要なactionPerformed(...)メソッドをクラスに与えていないことを訴えています。この最後の部分は非常に重要です。インターフェイスを実装するクラスは、ネストされたクラスではなく、独自のスコープですべてのインターフェイスの必要なメソッドを実装する必要があります。これは、ActionListener やその他のインターフェイスも実装するクラスをネストすることを妨げるものではありませんが、インターフェイスを実装する非抽象クラスはインターフェイスのすべてのメソッドをオーバーライドする必要があるという規則は残ります。

ただし、クラスのオブジェクトを ActionListener として使用していないため、単純な解決策は、クラスを ActionListener インターフェイスの実装として宣言しないことです。問題が解決しました。そして実際には、GUI クラスにリスナー インターフェイスを実装させない方がはるかに良いでしょう。それらを 1 つのクラスに結合すると、クラスに多くのことを要求しすぎるからです。技術的に言えば、クラスの結束を不必要に低下させ、結合を増やして可読性と保守性を低下させるリスクがあります。

于 2013-06-15T21:38:29.003 に答える