私はJavaでいくつかのトランプカードに取り組んできました。 (実際には実際の目的ではなく、私はカードを楽しむだけで、彼らは良い練習です)今、今、私はいくつかのカード構造、デッキ、手、杭などを作っています。私はいくつかの継承を使いたいと思っています。要約継承とジェネリックス(トランプ付き)
私が遭遇した問題は、各構造のコアがある種のコレクションであることですが、すべて同じコレクションタイプを使用するわけではありません。デッキは本質的にスタックとして機能するため、スタックを使用します。しかし、手にはArrayListが使用されます(使用するArrayListよりも効率的なものがあれば、同様に知っておくと良いでしょう)。 抽象クラスを書くとき、抽象メソッドの使用を避けたいと思います(コードを節約するために、抽象クラスを作成する本来の目的を破っているので)。しかし、これらのメソッドはすべて、コアコレクションに依存しているのは明らかですが、コレクションの種類はわかりません。これはこれまで私が試したことです:
public abstract class CardSet
{
protected AbstractCollection<Card> elCollection;
public CardSet()
{
super();
}
public CardSet(Card[] cards)
{
super();
for(Card c: cards)
elCollection.add(c);
}
public void add(Card c)
{
elCollection.add(c);
}
}
public class Pair extends CardSet //Pair is just a dummy class to get inheritance right
{
ArrayList<Card> elPair;
public Pair()
{
elPair = new ArrayList<Card>(); //elPair is defined, because casting
elCollection = elPair; // elCollection to arraylist would be a pain.
}
public Pair(Card[] cards)
{ this();
super(cards);
}
}
最初に、私の変数名を許してください。私はすべての "theVariable"という名前を使用していましたが、私は "エル"を使用する方がより興味深いと判断しました。 (あなたは何とか自分自身を楽しまなければなりませんか?)また、protectedを使用するのは、単純化のためです。
一般的な考え方は、抽象クラスで変数を定義し、子クラスでそのエイリアスを定義するように動作しているようですが、それは大したことではありません。 私が持っている本当の問題は、コンストラクタにあります。カードを追加するには、親コンストラクタがカードを追加しようとする前に、最初に コレクション(この場合はArrayList)を作成する必要があるため、一連のカードを受け入れるペアのコンストラクタは機能しません。 これを回避する方法はありますか?これは継承を処理する実行可能な方法ですか?
この(新しいArrayList())をこの((C)の新しいArrayList ())に変更する必要がありましたが、これで「未確認または安全でない操作」エラーが発生します。 –
Retsam
True - タイプセーフなオブジェクトを返す静的ファクトリを作成するように更新しました。 – Stephen
あなたはリストのジェネリック型を返すようにすることができますが、あなたはオプションを開いたままにしたいと思っています。私は空のコンストラクタを持つことは限られた利益のものであると推測したいと思います(あなたの専門家/コンビニエンスクラスを作成するとき) – Stephen