私は現在、Bで使用したいいくつかの機能を持つクラスAを持っています.AにはButton型のメンバ変数があり、BIでは型を使用したいIconButton(Buttonから派生したもの)。派生クラスのメンバ変数に派生型を使用
クラスは、このようなものです:あなたが見ることができるように
public class A {
protected Button x = new Button();
A() {
x.xx();
}
public void doFirstThing() {
x.xx();
}
Button getButton() {
return x;
}
}
public class B extends A {
B() {
x = new IconButton();
getButton().yy();
}
public void doSecondThing() {
getButton().zz();
}
IconButton getButton() {
return (IconButton) x;
}
}
public class Button {
public void xx() {
}
}
public class IconButton extends Button {
public void yy() {
}
public void zz() {
}
}
、方法yy()
とzz()
は、このように私は方法getButton
を提供することにより、Bの「回避策」を実行する必要があり、IconButton
でのみ使用可能です。
そして、我々はあまりにもでgetButton()
方法を持っていると思いますので、これはB.
にこじつけ加えていない。しかし、私は思ったんだけど、はい、通常、これは本当に正しい方法ですか、私はそれを間違っている?
私は抽象クラスを作成することも考えました。 A.から現在のコードを含んでいるでしょうA0は、その後、私はちょうど作りたい:
class A extends A0<Button> {
// mostly empty, code taken from A0
}
class B extends A0<IconButton> {
// custom things here
}
またはこの問題のために、本当に優れている他の方法があるの?
これはGWTアプリケーションのコンポーネントです。ですから、@king_nakのように宣言すれば、コンポーネントに2つのボタンがあります。また、別の回避策を講じても問題が解決しない場合は、Bの元のボタンを削除することができます。 x.removeFromParent()
かそのようなものですが、それはまったく新しいレベルの悪い習慣になってしまいます。
抽象クラス 'についてのAフィールド' T X 'と '何'クラスBはA 'を拡張しますか? –
ある時点でクラスAのインスタンスを構築するつもりかどうかはわかりません。もしそうなら、 'IconButton getButton()'が必須ではないことを除いて、それは大丈夫です。 'A'のインスタンスを作成しない場合は、それを抽象化します。 – KarelG
IconButtonはB.の実装の詳細です.IconeButtonとButtonをこれらのクラスのクライアントに公開する理由は? – davidxxx