JavaのObservableではマルチ継承の解決方法はサポートされていません
1289 ワード
Java , Swing , UI 。 java.util Observable Observer。
しかし、Swingベースのグラフィックプログラムであれば、Swingコントロールを継承したクラスでObservableをどのように継承するのでしょうか.
単一継承Javaでは,答えは不可能である.
引き継ぐことができなくて、組み合わせを使いました.
次に、JPanelを例に挙げます.
public class ObservablePanel extends JPanel {
// , 。
protected Observable notifier = new Observable();
//
}
しかし、使用時にはnotifierのsetChanged方法は?全然ないでしょ?
ドキュメントを調べるとsetChangedはprotectedメソッドで、外部では呼び出せません.
そこで、私たちは自分でそんなに愚かではないObservableを実現しましょう.
public class NotStupidObservable extends Observable {
@Override
public/* protected*/ synchronized void setChanged() {
// TODO Auto-generated method stub
super.setChanged();
}
}
このNotStupidObservableクラスではsetChangedメソッドを書き換え,その権限を拡張し,外部でnotifier.setChanged()メソッドを呼び出すことができるようにした.
次に、ObservablePanel内のnotifierをNotStupidObservableと宣言します.
public class ObservablePanel extends JPanel {
// , 。
protected NotStupidObservable notifier = new NotStupidObservable();
//
}
問題は解決した.
新しいスキルget:
1.継承された場所を使用できない場合は、組合せを使用することも考えられます.(OOPデザインでは優先組み合わせだったそうです?)
2.子は親の書き換え方法を継承してアクセス権を拡大できますが、縮小することはできません.そうしないと、ディミットの原則に違反します.