所以,我一直在研究 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)。有没有办法解决这个问题?这甚至是处理继承的可行方法吗?