【发布时间】:2010-10-13 23:32:37
【问题描述】:
所以,我一直在用 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)。 有没有办法解决这个问题?这甚至是处理继承的可行方法吗?
【问题讨论】:
标签: java generics inheritance abstract