それで、私は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」という名前を付けていましたが、「el」を使用する方が面白いと判断しました。(なんらかの方法で自分を楽しませる必要がありますよね?) また、protected を使用したのは単純化のためでした。
現在、抽象クラスで変数を定義し、子クラスでそのエイリアスを定義するという一般的な考え方は機能しているようですが、それが優れた方法であるかどうかはわかりません。私が抱えている本当の問題は、コンストラクターにあります。カードの配列を受け入れる Pair のコンストラクターは機能しません。カードを追加するには、親コンストラクターがカードを追加しようとする前に、まずコレクション (この場合は ArrayList) を作成する必要があるためです。これを回避する方法はありますか? これは継承を処理する実行可能な方法ですか?