2

こんばんは、

コンテナークラスBoxに包含クラスの が含まれるように、一連の Java クラスを開発しています。Aは、他の との関係を指定できる必要があります。これを行う良い方法は、次のようにすることだと思いました。ListWidgetWidgetWidgets

public abstract class Widget {
    public static class WidgetID {
        // implementation stolen from Google's GWT
        private static int nextHashCode;
        private final int index;

        public WidgetID() {
            index = ++nextHashCode;
        }

        public final int hashCode() {
            return index;
        }
    }

    public abstract WidgetID getWidgetID();

}

のサブクラスは次のようになりWidgetます。

public class BlueWidget extends Widget {
    public static final WidgetID WIDGETID = new WidgetID();

    @Override
    public WidgetID getWidgetID() {
        return WIDGETID;
    }
}

これで、BlueWidgetが実行できgetBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.WIDGETIDBox2 番目のパラメーターを と比較してリストを反復処理できますiter.next().getWidgetID()

今のところ、これはすべてうまく機能しています。私がやろうとしているのはpublic static final WidgetID WIDGETID、すべてのサブクラスで宣言し、代わりに親Widgetクラスに実装する必要がないようにすることです。問題は、そのコード行をWidget( の実装とともにgetWidgetID()) に移動すると、 のサブクラスのすべてのインスタンスが、に対して同じにWidgetなるように見えることです。ただし、非静的にすると、 を呼び出すことさえできなくなります。static final WidgetIDSubclassname.WIDGETIDSubclassname.WIDGETID

のインスタンスとサブクラスごとに異なることを確認しながらWidgetID、親クラスに静的を作成するにはどうすればよいですか? それとも、ここでの仕事に間違ったツールを使用していますか?WidgetWidgetWidget

ありがとう!

super()[編集] ライブラリのユーザーがすべてのサブWidgetコンストラクターを呼び出す必要はありません。

4

3 に答える 3

5

WidgetID は特定のサブクラスごとに一意であるという考えのように思われるので、代わりにクラスで識別してみませんか?

そのため、あなたが行っている場所では、代わりに行うgetBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.WIDGETID)ことができますgetBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.class)

于 2010-04-14T20:57:27.320 に答える
4

すべてのサブクラスが異なる値を持つ場合、変数はスーパークラスのメンバーではありません。

つまり、はい、各サブクラスは独自の WIDGETID を宣言する必要があります。さまざまなクラスのメンバーをスーパークラスの 1 つのメンバーとして統合することはできません。

于 2010-04-14T20:52:07.393 に答える
0

次のような Widget 内で抽象メソッドを宣言しないのはなぜですか。

protected abstract WidgetID getWidgetID();

このように、各サブクラスはメソッドを実装し、独自の値を返す必要があります。サブクラス内で WidgetID を静的に宣言することはできますが、上記のインスタンス メソッドは「一意の」値を返します。

于 2010-04-14T20:57:29.463 に答える