Как дифференцировать подклассы в ArrayList суперкласса - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть 2 подкласса (MultiCard и BasicCard), и я хочу вызвать метод (addCurrency), принадлежащий MultiCard, из класса Bank.
Этот метод используется для добавления дополнительной валюты в MultiCard, у которого есть ArrayList валют,Однако, поскольку MultiCard является подклассом класса Card, я не могу получить доступ к MultiCard.Все карты хранятся в List<Card>cards;

Я не хочу использовать решение на основе приведения (проверка с помощью instanceof и затем приведение экземпляра Card к MultiCard)

Суперкласс:

public abstract class Card implements Comparable<Card>, Cloneable
{
protected String id;
protected String name;
protected List<Purchase> purchases;
static int counter = 1000;

public Card(String name)
{
    counter++;
    this.id = Integer.toString(counter);
    this.name = name;
    this.purchases = new ArrayList<Purchase>();
}

Метод, который я хочу использовать в классе MultiCard, расширяет карту

public class MultiCard extends Card implements Cloneable
{
protected static List<String> currencies;
protected double[] balance;
public static final int currencyCount = 5;
public MultiCard (String name)
{
    super (name);
    currencies = new ArrayList<String>();
    balance = new double[currencyCount];
    currencies.add ("AUD");
    for (int i = 0; i < balance.length; i++)
        balance[i] = 0;
}
public boolean addCurrency (String currency)
{
    if (currencies.size () == currencyCount ||containsCurrency (currency)) {
        return false;
    }
    currencies.add (currency);
    return true;
}

Метод addCurrency (), который мне нужно изменить в классе Bank

private static final String[] currencyLabel = { "AUD", "NZD", "USD", "CND", "YEN", "BPD" };
private static final double[] currencyRate = { 1.0, 1.2, 0.75, 0.85, 80, 0.7 };
private String adminUsername;
private String adminPassword;

Map<String, User> users = new HashMap<>();// username

public Bank(String admName, String admPassword){
    this.adminUsername  = admName;
    this.adminPassword = admPassword;
public boolean addCurrency(String cardID, String username, String password, String currency) { ...
}

Метод addCurrencyиспользуется для добавления валюты в список, который находится в MultiCard.Он вызывает метод в MultiCard

Вот что я пробовал:

public boolean addCurrency(String cardID, String username, String password, String currency)
{
   User user = users.get(username);
   user.getACard(cardID, username, password); // here is my problem - a Card instance is returned, which must be cast to a MultiCard

}

1 Ответ

2 голосов
/ 26 апреля 2019

Поскольку вопрос немного сбивает с толку, я предполагаю, что когда вы вызываете метод user.getACard(cardID, username, password), вы получаете объект Card.Идеальным решением было бы то, что для вызова метода addCurency() Вы можете добавить абстрактный метод public boolean addCurrency (String currency) в классе Card (если вам вообще разрешено изменять класс Card).В противном случае вам придется привести Card Object к MultiCard Object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...