1

私は2つのクラスを持っています:

public abstract class A extends JPanel {

    @Override
    public void repaint() {
        super.repaint();
        //my own implementation of A repaint
    }

    private void method2() {
         //I need to call the repaint method of A here
    }

}

public class B extends A {

    @Override
    public void repaint() {
        super.repaint();
        //my own implementation of B repaint
    }
}

簡単な検索で、基本クラスから基本オーバーライドされたメソッドを呼び出す方法がないことがわかりました。問題は、repaintA 内で A のメソッドをどのように呼び出すことができるかということです。ここで説明されているように、基本メソッドを作成し、明示的に拡張する別のメソッドを作成できることはわかっていますが、Java 設計パターンに従うためにすべての子に共通する必要があるメソッドであるため、最も何よりも重要なことは、別のプログラマーが私の仕事を続けている場合、彼は再描画メソッドを探しているでしょう.これを行うための提案はありますか?

編集:申し訳ありませんが、クラス A が抽象であることを忘れていたので、A のすべてのインスタンスも B です (想像してください、A クラスの子がもっとあるので、B で完全に実装することはできません。 A のすべての子でその動作が必要なため)、また、実行の特定の部分で A のビューを更新する必要があるため、これが必要ですが、A のものを更新せずに A のそれぞれの部分をペイントしたいだけです子どもたち。

4

3 に答える 3

2

メソッドをオーバーライドしないことをお勧めしますrepaint()。おそらくやりたいことは、実際にpaint(Graphics g)メソッドをオーバーライドすることです。

于 2012-11-23T15:16:28.160 に答える
1
public abstract class A extends JFrame {

    @Override
    public void repaint() {
        myRepaint();
    }

    private void myRepaint() {
        super.repaint();
        //my own implementation of A repaint
    }

    private void method2() {
         myRepaint();
    }

}

public class B extends A {

    @Override
    public void repaint() {
        super.repaint();
        //my own implementation of B repaint
    }
}
于 2012-11-23T15:24:42.780 に答える
0

implを明示的に呼び出せないのは良いことです。これにより、サブクラスは自分のニーズに合わせてimplを変更できます。これを許可すると、Javaのオブジェクト指向設計全体が損なわれます。

ただし、これを行うことができます。

public void repaint() {
    repaintImpl();
}

private void repaintImpl() {
    // whatever
}

そして、repaintImpl()「ベースの再ペイントメソッドを呼び出す」場所を呼び出します。

于 2012-11-23T15:25:48.900 に答える