简体   繁体   English

子类和超类

[英]Subclasses and Superclasses

I'm trying to build a program that has certain requirements, the main being I have a class, and then make a subclass that adds a feature. 我正在尝试构建具有某些要求的程序,主要是我有一个类,然后制作一个添加功能的子类。 I create the class DVD, and then I create the subclass. 我创建了类DVD,然后创建了子类。

I'm adding a method to add the year to the list, as well as a restocking fee which will be added to the final inventory value that prints. 我要添加一种将年份添加到列表中的方法,以及将添加到打印的最终库存值中的进货费。 I built the subclass, created the overriding methods, but it is not being added to the output displayed. 我构建了子类,创建了覆盖方法,但未将其添加到显示的输出中。 Not only that, but it is placing the input year in the wrong place. 不仅如此,还将输入年份放置在错误的位置。 I am not getting any errors, it just acts like the subclass doesn't exist, even though my DVD class says that some of the methods are being overridden. 我没有收到任何错误,即使我的DVD类说某些方法已被覆盖,它的行为就像不存在子类一样。

I'm thinking I must be missing something where I am supposed to call the new method, and maybe I read the resource wrong, but it sounded like I only needed to call the DVD class, and the methods I wanted overridden would be overridden automatically. 我想我肯定在应该调用新方法的地方丢失了一些东西,也许我读错了资源,但是听起来我只需要调用DVD类,而我想覆盖的方法将被自动覆盖。 。 I'd prefer to just add this information to the superclass, but it is a requirement for an assignment. 我宁愿仅将此信息添加到超类中,但这是分配的要求。

So I'm wondering how do I actually go about calling these override methods when I need them to add these new features? 所以我想知道当我需要这些重写方法添加这些新功能时,我该如何去实际使用它们呢? I keep seeing resources telling me how to create them, but not actually implement them. 我一直看到资源告诉我如何创建它们,但实际上并未实现它们。

From my main method, I call the dvd class and then print it. 从我的主要方法中,我调用dvd类,然后打印它。 however, it only prints what's in the original dvd class, except for the odd addition of adding the year to where the product ID should be. 但是,它只显示原始dvd类中的内容,除了在产品ID应该添加的年份中加上奇数个字符之外。

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();
}
}

In the main method you just instantiate a DVD object, not an ExtendedDVD object. 在main方法中,您只实例化DVD对象,而不是ExtendedDVD对象。

replace 更换

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

by something like 通过类似

DVD dvd= new ExtendedDVD(year);

And obviously, you may want another constructor in ExtendedDVD 显然,您可能需要ExtendedDVD另一个构造函数

if you want to use the new methods that you wrote in ExtendedDVD you need to instantiate that class you are still calling the original dvd class so you will still get those methods. 如果要使用在ExtendedDVD中编写的新方法,则需要实例化该类,而您仍在调用原始dvd类,因此您仍将获得这些方法。

for example 例如

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

and

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

are two different things 是两件事

also if you look in your main method you are assigning itemNum twice that is why it is showing you the year 另外,如果您查看主要方法,则将两次分配itemNum,这就是为什么它向您显示年份

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM