хранение и печать значений, хранящихся в массиве объектов подкласса абстрактного класса - PullRequest
0 голосов
/ 31 октября 2019

Я все еще изучаю Java, так что терпите меня.

Построение предыдущей работы. Итак, у меня есть абстрактный класс Stock с классом ETF и классом Dividend, который расширяет класс Stock. ETF и Дивиденды переопределяют расчетную цену со склада. В другом классе StockManager я могу использовать некоторые входные данные в качестве имени акции, цены акции и либо значения ETF, либо дивиденда. Ранее я сохранял эти входные данные в массиве объектов

Stock [] stk = new Stock [STOCKLIMIT]

Теперь, так как Stock является абстрактным классом, я больше не могу этого делать. Как мне сохранить эти значения? или распечатать их?

Наряду с этим в StockManager вы можете добавлять, удалять, распечатывать или находить общую стоимость акций.

Удалены некоторые ненужные вещи. Просто нужна помощь для добавления, печать и общая стоимость

Класс StockManager

public class StockManager
{

   Scanner stdin = new Scanner(System.in);

   final int STOCKLIMIT = 6;
   int numberOfStocks = 0;

   Stock[] stk = new Stock[STOCKLIMIT]; //before stock was abstract

   String name;
   Double namePrice;
   int etfDividendVal;


   public void run()
   {
      String command = stdin.next();

      while (!command.equalsIgnoreCase("Q"))
      {
         if (command.equalsIgnoreCase("A"))
         {

            else
            {
               String commandTwo = stdin.next(); //either e for etf or d for dividend

               if (commandTwo.equalsIgnoreCase("E"))
               {
                  name = stdin.next();
                  namePrice = stdin.nextDouble();
                  etfDividendVal = stdin.nextInt();

                  //stk[numberOfStocks] = new Stock(name, namePrice); //object array when stock wasn't abstract

                  //store name, namePrice, and etfDividendVal somewhere now that stock is abstract

                  numberOfStocks++;
               }

               else if (commandTwo.equalsIgnoreCase("D"))
               {
                  name = stdin.next();
                  namePrice = stdin.nextDouble();
                  etfDividendVal = stdin.nextInt();

                  //stk[numberOfStocks] = new Stock(name, namePrice);

                  //where to store name, namePrice, and etfDividendVal somewhere now that stock is abstract

                  Stock stk = new Dividend();
                  numberOfStocks++;
               }
               }
            }
         }


         else if (command.equalsIgnoreCase("R")) //remove a stock
         {
            else
            {
               name = stdin.next();
               namePrice = stdin.nextDouble();

               for (int i = 0; i < numberOfStocks; i++)
               {
                  if (stk[i].getTicker().equals(name))
                  {
                     for(int z = i; z < numberOfStocks; z++)
                     {
                        if (z + 1 == numberOfStocks)
                           stk[z] = null;
                        else
                           stk[z] = stk[z+1];
                     }  
                     numberOfStocks--;
                  }
               }
            }
         }

         else if (command.equalsIgnoreCase("P"))
         {
            else
            {
               // print stock name, price, and etf/divident value
               }
            }
         }

         else if (command.equalsIgnoreCase("C"))
         {
            else
            {
               //print the total cost
            }
         }
      }
   } 
}

Абстрактный Класс акций

abstract public class Stock
{
   protected String commandTwo;
   protected String ticker;
   protected Double price;
   protected int etfDividendVal;

   public Stock()
// default constructor

   public Stock(String commandTwo, String ticker, Double price, 
                int etfDividendVal)
   {
      this.commandTwo = commandTwo;
      this.ticker = ticker;
      this.price = price;
      this.etfDividendVal = etfDividendVal;
   }


   public String getTicker()
   {
      return ticker;
   }


   public String setTicker(String name)
   {
      ticker = name;
      return ticker;
   }


   public Double getPrice()
   {
      return price;
   }


   public Double setPrice(Double namePrice)
   {
      price = namePrice;
      return price;
   }


   @Override
   public String toString()
   {
      return this.ticker + " " + this.price + "\t";

   }

   public abstract double calculatePrice();
}

Класс ETF

public class ETF extends Stock
{
   public float numberOfStocks;

   @Override
   public double calculatePrice()
   {
      return (price * numberOfStocks);
   }
}

Класс дивидендов

public class Dividend extends Stock
{
   public float yieldPercentage;

   @Override
   public double calculatePrice()
   {
      return (price * yieldPercentage);
   }
}

Это должно выглядеть примерно так

Pick an option:  A-Add R-Remove   P-Print    C-Total cost     Q-Quit
A
E
AMD
30.45
10
Pick an option:  A-Add R-Remove   P-Print    C-Total cost     Q-Quit
A
D
FXAIX
100
3
Pick an option:  A-Add R-Remove   P-Print    C-Total cost     Q-Quit
P
AMD 30.45 10.0
FXAIX 100.0 0.03
Pick an option:  A-Add R-Remove   P-Print    C-Total cost     Q-Quit
C
The total cost is: 307.4999999329448

1 Ответ

0 голосов
/ 31 октября 2019

Вы все еще можете создать массив Stock[], поскольку ETF и Dividend оба расширяют Stock, их можно добавить в массив. Чтобы использовать методы, объявленные в ETF и Dividend для объектов, которые вы извлекаете из массива, вам нужно привести их, например, так: ETF etf = (ETF) stk[someIndexHere];. Обратите внимание, что вы не знаете, какие объекты на самом деле ETF, а какие на самом деле Dividend, и если вы приведете их к типу, которого на самом деле нет, вы получите ошибку. Вы можете проверить, является ли объект из stk ETF или Dividend, используя оператор instanceof:

Stock stock = stk[0]; // Provided that there is a Stock at stk[0]

if (stock instanceof ETF) {
    ETF etf = (ETF) stock;
    // Now you can use etf as an ETF object
} else if (stock instanceof Dividend) {
    // The second if-statement is redundant since there are only
    // two possibilities, but in the future there might be more
    // classes extending Stock
    Dividend div = (Dividend) stock;
    // Now you can use div as a Dividend object
}

Хотя, поскольку ни ETF, ни Dividend не реализуют какие-либо новые методы, приведениене нужноinstanceof тоже, если вы не хотите сообщить своему пользователю, с каким типом акций он имеет дело.

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