Подклассы и суперклассы

Я пытаюсь создать программу с определенными требованиями, главное из которых заключается в том, что у меня есть класс, а затем я создаю подкласс, который добавляет функцию. Я создаю DVD класса, а затем создаю подкласс.

Я добавляю метод добавления года в список, а также плату за пополнение запасов, которая будет добавлена ​​к окончательной стоимости запасов, которая печатается. Я построил подкласс, создал переопределяющие методы, но он не добавляется к отображаемому выводу. Не только это, но и ввод года ввода в неправильном месте. Я не получаю никаких ошибок, он просто действует так, как будто подкласс не существует, хотя мой класс DVD говорит, что некоторые методы переопределяются.

Я думаю, что я должен что-то упустить, где я должен вызывать новый метод, и, возможно, я неправильно прочитал ресурс, но это звучало так, как будто мне нужно было только вызвать класс DVD, и методы, которые я хотел переопределить, будут переопределены автоматически . Я бы предпочел просто добавить эту информацию в суперкласс, но это требование для задания.

Поэтому мне интересно, как мне на самом деле вызывать эти методы переопределения, когда они мне нужны для добавления этих новых функций? Я продолжаю видеть ресурсы, рассказывающие мне, как их создавать, но не реализовывать их на самом деле.

Из моего основного метода я вызываю класс dvd, а затем распечатываю его. однако он печатает только то, что находится в исходном классе dvd, за исключением странного добавления года к тому месту, где должен быть идентификатор продукта.

public class DVD {



String name;
int id;
int items;
double cost;

//default constructor
public DVD() {
    name = "";
    id = 0;
    items = 0;
    cost = 0.0;
}//end default constructor

//constructor to initialize object
public DVD(String dvdName, int itemNum, int quantity, double price) {
    name = dvdName;
    id = itemNum;
    items = quantity;
    cost =  price;
}//end constructor


//method to calculate value
public double getInventoryValue() {
       return items * cost;
}

//method to set name
public void setdvdName(String dvdName){
    this.name = dvdName;
}

//method to get name
public String getName(){
    return name;
}

//method to set id
public void setitemNum( int itemNum){
    this.id = itemNum;
}

//method to get id
public int getId(){
    return id;
}

//method to set items
public void setquantity(int quantity){
    this.items = quantity;   
}

//method to get items
public int getItems(){
    return items;
}

//method to set cost
public void setprice( double price){
    this.cost = price;
}

//method to get cost
public double getCost(){
    return cost;
}

/**
 *
 * @return
 */

public String toString() {

    return "DVD Name: " + getName() +
           "ID: " + getId() +
           "Items: " + getItems() +
           "Cost: " + getCost() + 
           "Total Value: " +getInventoryValue();
}
}

-

public class ExtendedDVD extends DVD{
double restockFee;
int year;

public ExtendedDVD(){
    year = 0;
}
public ExtendedDVD(int year) {
    this.year = year;
}

public void setRestockFee(){
    this.restockFee = 0.05;
}

public double getRestockFee(){
    return restockFee;
}


public void setYear(){
    this.year = 0;
}

public int getYear(){
    return year;
}

@Override
public double getInventoryValue(){
    double value1 = super.getInventoryValue();
    double value = restockFee * value1;
    double totalInventoryValue = value + super.getInventoryValue();
    return totalInventoryValue;
}

@Override
 public String toString(){
    return super.toString() + "Year" + getYear();
}
}

}

public class Inventory {

DVD[] inventory = new DVD[5];
int current = 0;
private int len;

public Inventory(int len){
    inventory = new DVD[len];

}

public double calculateTotalInventory() {
    double totalValue = 0;
    for ( int j = 0; j < inventory.length; j++ ) 
        totalValue += inventory[j].getInventoryValue();
    return totalValue;
}

/**
 *
 * @param dvd
 * @throws Exception
 */
public void addDVD(DVD dvd) throws Exception {
    if (current < inventory.length) {
        inventory[current++]=dvd;
    }else {
        Exception myException = new Exception();
        throw myException;

    }
    }
void sort() {
      for (DVD inventory1 : inventory) {
        len = current;
    }

      for (int i=0; i<len;i++) {
        for(int j=i;j<len;j++) {
            if (inventory[i].getName().compareTo(inventory[j].getName())>0) {
                DVD temp = inventory[j];
                inventory[j] = inventory[i];
                inventory[i] = temp;
            }
        }
    }
}




  public int getNumberOfItems() {
    return current;
}


    public void printInventory() {
    System.out.println("Current Inventory:");
    for(int i=0;i<current;i++) {
        System.out.println(inventory[i]);
    }
    System.out.println("The total value of the inventory is:"+calculateTotalInventory());
    }
}

-

public class inventoryprogram1 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args){


    boolean finish = false;
    String dvdName;
    int itemNum;
    int quantity;
    double price;
    int year = 0;

    Inventory inventory = new Inventory(5);
    while (!finish) {
        Scanner input = new Scanner(System.in); // Initialize the scanner
        System.out.print("Please enter name of DVD: ");
        dvdName = input.nextLine();
        if (dvdName.equals("stop")) {
            System.out.println("Exiting Program");
            break;
        } else {
            System.out.print("Please enter Product Number: ");
            itemNum = input.nextInt();
            System.out.print("Please enter units: ");
            quantity = input.nextInt();
            System.out.print("Please enter price of DVD: ");
            price = input.nextDouble();
            System.out.print("Please enter production year: ");
            itemNum = input.nextInt();

            DVD dvd= new DVD(dvdName,itemNum,quantity,price);

            try {
              inventory.addDVD(dvd);
            }catch( Exception e) {
                System.out.println("Inventory is full.");
                break;
            }

            System.out.println("DVD: " + dvd);

        }//end else

    }
       inventory.sort();
       inventory.printInventory();
}
}

person Laterali    schedule 22.02.2014    source источник
comment
Если вы никогда не создаете ExtendedDVD, то, очевидно, ни один из методов класса ExtendedDVD никогда не будет вызываться.   -  person JB Nizet    schedule 22.02.2014


Ответы (2)


если вы хотите использовать новые методы, которые вы написали в ExtendedDVD, вам нужно создать экземпляр этого класса, который вы все еще вызываете исходный класс dvd, поэтому вы все равно получите эти методы.

Например

DVD dvd = new DVD(dvdName, itemNum, quantity, price);

а также

DVD Dvd = new ExtendedDVD(dvdName, itemNum, quantity, price);

две разные вещи

также, если вы посмотрите в свой основной метод, вы назначаете itemNum дважды, поэтому он показывает вам год

person Mobius    schedule 22.02.2014
comment
Спасибо, что заметили это, я скопировал некоторые строки, чтобы идти быстрее, и полностью пропустил это. Вот тут я запутался. Даже в документах оракула не объяснялось, как его создать, и я не был уверен, вызывался ли он вместе с его суперклассом или мне нужно было вызывать его специально. - person Laterali; 22.02.2014
comment
Я думаю, что это случается со всеми, просто трудно это увидеть, если вы пишете код, и добро пожаловать - person Mobius; 22.02.2014

В основном методе вы просто создаете экземпляр объекта DVD, а не объекта ExtendedDVD.

заменять

DVD dvd= new DVD(dvdName,itemNum,quantity,price);

чем-то вроде

DVD dvd= new ExtendedDVD(year);

И, очевидно, вам может понадобиться еще один конструктор в ExtendedDVD

person Henry    schedule 22.02.2014