Я бы определенно переоценил вашу стратегию дизайна здесь, если это возможно. Использовать один класс и просто вернуть 0 для Джокера намного проще, чем то, что вы пытаетесь сделать.
Если, по какой-то причине, это не вариант, то интерфейс будет хорошим вариантом. Создайте интерфейс Card
и оба класса реализуют его. Обратите внимание на использование Integer
, а не int
в типе возвращаемого значения для учета нулевых значений. Кроме того, поскольку вы уже знаете все возможные значения для карты, не являющейся джокером, перечисление хорошо подходит для определения этого:
public interface Card {
public Integer getValue();
}
public class Joker implements Card {
@Override
public Integer getValue() {
return null;
}
}
public class NotJoker implements Card {
private CARD_TYPE cardType;
public NotJoker(CARD_TYPE type) {
this.cardType = type;
}
public CARD_TYPE getType() {
return cardType;
}
@Override
public Integer getValue() {
return cardType.getValue();
}
}
public enum CARD_TYPE {
ACE(11), KING(10), QUEEN(10), JACK(10),
TEN(10), NINE(9), EIGHT(8), SEVEN(7),
SIX(6), FIVE(5), FOUR(4), THREE(3),
TWO(2);
private final int value;
CARD_TYPE(int value) {
this.value = value;
}
public int getValue() {return value;}
}
Теперь мы можем создать наш класс для хранения карт, Deck
. Мы просто используем card.getValue()
для всех карт и проверяем, равен ли Integer
null
, прежде чем добавить его значение:
public class Deck {
private ArrayList<Card> cardList;
public Deck() {
cardList = new ArrayList<Card>();
}
public void addCard(Card card) {
cardList.add(card);
}
public int getTotalScore() {
int totalScore = 0;
for(Card card : cardList) {
Integer value = card.getValue();
if(value != null) {
totalScore += value;
}
}
return totalScore;
}
}
А вот быстрый тест, чтобы доказать, что он работает:
public class CardGame {
public static void main(String[] args) {
Deck deck = new Deck();
deck.addCard(new Joker());
deck.addCard(new NotJoker(CARD_TYPE.FIVE));
deck.addCard(new NotJoker(CARD_TYPE.FOUR));
deck.addCard(new NotJoker(CARD_TYPE.ACE));
deck.addCard(new NotJoker(CARD_TYPE.KING));
deck.addCard(new Joker());
deck.addCard(new NotJoker(CARD_TYPE.SEVEN));
//total score: 37
System.out.println("total score: " + deck.getTotalScore());
}
}