Итак, я работал над некоторыми игральными картами на Java. (На самом деле не для практической цели, мне просто нравятся игральные карты, и они - хорошая практика) Теперь, сейчас, я делаю несколько карточных структур, колод, рук, свай и т. Д. Все они практически одинаковы, поэтому Я полагаю, что хотел бы использовать некоторое наследование.Abstract Inheritance and Generics (с игральными картами)
Проблема, с которой я столкнулся, состоит в том, что ядром каждой структуры является некоторый тип коллекции, но они не все используют один и тот же тип коллекции. В колоде используется Stack, поскольку колода по большей части функционирует как стек чаще всего. Но в руке используется 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, который принимает массив карт, не работает, потому что для добавления карт мне сначала нужно создать коллекцию (в данном случае ArrayList), прежде чем родительский конструктор попытается добавить карты. Есть ли способ обойти это? Это даже жизнеспособный способ обработки наследства?
Мне пришлось изменить это (новый ArrayList()) на этот ((C) новый ArrayList ()), но из-за этого я получаю ошибку «непроверенные или небезопасные операции». –
Retsam
True - я обновился, чтобы создать статическую фабрику, которая вернет безопасный объект типа. – Stephen
Вы можете заставить его вернуть общий тип списка, но я верю, что в этом случае вы хотите оставить свои варианты открытыми. Я также рискну предположить, что наличие пустого конструктора имеет ограниченную выгоду (когда вы создаете свой специалист/класс удобства в любом случае) – Stephen