1

これは実際的な質問ですが、実際的な答えがあるかどうかはわかりません。たとえば 10 個のサブクラスを持つスーパークラスがある場合、これらの 10 個のサブクラスをコレクションに入れる最も簡単な方法は何ですか? 現時点では (これは悪い設計かもしれません)、スーパークラスの静的コレクション フィールドにそれらを配置しました。

ただし、この質問の動機は、サブクラスの 1 つのフィールドの 1 つの ID を取得したためでしたが、同じサブクラスの別のフィールドへの参照が必要でした。

たとえば、サブクラスに次のフィールドがあるとします。

public class SampleSubClass extends SampleSuperClass{
...
private Object1 o_1;
private Object2 o_2;
private Object3 o_3;
...
}

プログラムのどこかで、私は o_2 の ID しか持っておらず、o_3 に到達したかったのです。理論的には、SampleClass のすべてのインスタンスをコレクションのどこかに置くよりも簡単な方法があるかもしれません。たとえば、おそらく私の夢の中に、スーパークラスがそのサブクラスに関する情報を保持し、スーパークラスがそれ自体でコレクションとして機能するソフトウェア言語があるとします。

しかし、気にしないでください。私には、コレクションをプログラムのどこかに置く良い方法のように思えます。それは、ハッシュマップ/ハッシュテーブルを使用し、それをスーパークラスの静的メンバーとして使用することです。

もっと良い方法があることを教えてください。オブジェクト内のフィールド B への参照のみを使用して、オブジェクト内のフィールド A を参照する方法はありますか?

たとえば、ActionPerformed メソッドがあるとします。このメソッドには、ActionEvent オブジェクト パラメータに含まれるソース オブジェクトがあります。そのソースオブジェクトを所有/含んでいたクラスのインスタンスを見つけるにはどうすればよいですか? これを設計する最良の方法は何ですか?

4

2 に答える 2

1

あなたの直接の質問に答える: 特定のクラスのセットを含むコレクションを簡単に定義する方法は?

public class ClassA {
    private final List<Class<? extends a>> knownSubclasses = Arrays.asList(ClassB.class, ClassC.class);
};
class ClassB extends ClassA {}
class ClassC extends ClassA {}

あなたの動機への回答: スーパークラスで宣言せずにサブクラスのフィールドにアクセスする方法は?

public class SomeSuperclass {
    protected Object3 getObject3() throws UnsupportedOperationException {
        throw new UnsupportedOperationException();
    }
}
public class SomeSubclass extends SomeSuperclass {
     private final Object3 object3 = null;
     @Override
     protected Object3 getObject3() { return object3; }
}

おそらく、インターフェースを使用してobject3を持つインスタンスを認識します

public interface MyClassWithObject3 { Object3 getObject3(); }

...
void someOperation(SomeSuperclass that) {
   if (that instanceof MyClassWithObject3) { ... }
}

名前付きプロパティを使用することもできます

void someOperation(SomeSuperClass that) {
    Object3 object3 = that.getProperty("object3");
}
于 2013-06-05T00:24:38.543 に答える