使用具有子类实例的超类实例

时间:2017-11-10 00:46:22

标签: java object inheritance polymorphism

我的目标是创建一个超类产品

使用此超类创建不同的对象,例如:

  • USB记忆棒8gb
  • HHD 1tb
  • SSD 512gb

具有不同的价值(如价格)。

用于创建这些产品的不同对象的子类(例如 USB stick 8gb :我总共有5个(对象):1。new,2。used, 3. used,4。new,5。new)

使用我的版本(见上文),您总是需要为每个版本(1-5)提供相同的参数

Item usbstick1;
usbstick1 = new Item(50, "3.0 USB-Stick with 8 Gigybytes of storage", true)

我如何实现:

a)仅提供已创建的"产品的引用" (比如 USB Stick 8gb )每次创建一个新的子类对象?

b)如何将此参考用于不同的子类?

如果我有超级

public class Product {

    double price
    String description

    public Item(double price, String description) {
        setPrice(price);
        setDescription(descrition);
    }

    setPrice(double newPrice) {
        price=newPrice;
    }
    public void setDescription(String newDescription) {
        description=newDescription;
    }

子类

public class Item extends Product {
    boolean sealed;

    public Item(double price, String description, boolean sealed) {
        super(price, description);
        setSealed(sealed);
    }

    public void setSealed(newSealed) {
        sealed=newSealed;
    }

这个子类

public class UsedItem extends Product {
    int usedDays;

    public UsedItem(double price, String description, int usedDays) {
        super(price, description);
        setUsedDays(usedDays);
    }

    public void setUsedDays(newUsedDays) {
        usedDays=newUsedDays;
    }    

1 个答案:

答案 0 :(得分:0)

您可能需要考虑将UsedItem类更改为包含Product的实例,而不是扩展它,然后在构造函数中传递产品:

public class UsedItem {

   Product product;
   int usedDays;

   public UsedItem(Product product) {
       this.product = product;
   }

   public void setUsedDays(newUsedDays) {
       usedDays=newUsedDays;
   }
}

然后要创建新的UsedItem,您可以将它传递给您制作的相同产品实例:

Item usbstick;
usbstick = new Item(50, "3.0 USB-Stick with 8 Gigybytes of storage", true);

UsedItem usb1 =  new UsedItem(usbstick);
UsedItem usb2 =  new UsedItem(usbstick);
UsedItem usb3 =  new UsedItem(usbstick);

或者,您可以将已使用的项目设置为在构造函数中获取Item并从中设置值:

public class UsedItem extends Item{

   public UsedItem(Product product) {
       super(product.price, product.description);
   }
}