Итак, я работал над некоторыми игральными картами на 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» было интереснее. (Вы должны как-то развлечься, верно?) Кроме того, использование защищенного было просто ради простоты.
Теперь, похоже, сработает общая идея: определить переменную в абстрактном классе, а затем определить ее псевдоним в дочернем классе, но я не уверен, что это хорошая практика.
Реальная проблема у меня с конструктором. Конструктор в Pair, который принимает массив карт, не работает, потому что для добавления карт мне сначала нужно создать
collection (в данном случае ArrayList) до того, как родительский конструктор попытается добавить карточки.
Есть ли способ обойти это? Это даже жизнеспособный способ обработки наследства?