0

「親と子」オブジェクトの概念を持つシステムで完全なタイプ セーフを実現するために、パラメーターを過剰に使用することに手を出していました。パラメータを書くのがとても醜いので、おそらくこのレベルのパラメータ化を維持するつもりはありません。ただし、概念的には次のようなものがあります。

ModelObject<BaseType extends ModelObject<BaseType, ChildType>, ChildType extends ModelObject<ChildType,?>> 
{

 abstract Set<ModelObject<?, BaseType>> getParents();

 //other logic
 }

これは単純化されたバージョンです。元のバージョンでは、親とベースと子を指定して、物事をより明確にし、さらに醜くしました。

私がこれらすべてを維持したと仮定すると、主な弱点は、子には 1 つのタイプの親しか許可されず、親ごとに 1 つのタイプの子しか許可されないことです。今はまったく役に立ちませんが、理論的には、3人以上の子供を持つことは理にかなっています.

インターフェイスを持つ2人の子供を許可できるので、次のようなものです

MyObject extends ModelObject<MyObject, ChildA> implements hasChild<childB>

しかし、「2人の子供を持つ、3人の子供を持つ」などのインターフェースをたくさん作りたくない限り、明らかにこれは2人の子供にしか機能しません。

潜在的な「子」のリストのいずれかに一致する子オブジェクトを作成できるように、任意の数の「子」パラメーターを何らかの形で作成できる汎用抽象クラスを作成する方法はありますか? 答えはノーだと思いますが、興味があります。この構造全体は、制限が厳しすぎて、すべてのタイプが飛び交う少し醜いので、おそらく処理されません。しかし、それができるかどうかを確認するために、楽しみのためにそれに手を出していました:)

4

3 に答える 3

1

あなたの質問の詳細は少し不明確ですが、「指定されていないサイズのパラメーターのリストを許可することは可能ですか?」というより基本的な質問に答えるには、簡単な答えは「はい」です。Java では可変長の引数リストを使用できます。それはvarargsと呼ばれます。

MyObject インターフェイスと MyObject1、MyObject2 などのクラスがすべてそのインターフェイスを実装している場合、次のようなことができます。

private List<MyObject> getParents(MyObject... children) {
    List<MyObject> parents = new ArrayList<MyObject>();

    for(MyObject child : children) {
        parents.add(child.getParent());
    }

    return parents;
}

...またはこれ ( MyObject のこの特定の実装がその子をリストに格納すると仮定):

public List<MyObject> getChildren() {
    return Collections.unmodifiableList(children);
}

public boolean hasChildren(MyObject... children) {
    return parent.getChildren().containsAll(Arrays.asList(children)); // 
}
于 2013-05-10T19:17:39.293 に答える
0
void foo(Integer... x) {
    Integer x1 = x.length > 0 ? x[0] : 0; 
    Integer x2 = x.length > 1 ? x[1] : 0;//x2 is set to the value of the second string that was passed in
    //...
}
于 2013-05-10T19:21:45.673 に答える
0

それぞれを個別に渡すのではなく、子のリストを渡すことができます。その後、任意の量になる可能性があり、各クラスを再実装する必要はありません。各クラスを別々に指定する必要がある唯一の理由は、それぞれが根本的に異なる場合です。

于 2013-05-10T19:19:07.713 に答える