具有返回类型的Java inherance方法

时间:2015-10-02 09:46:22

标签: java inheritance review

写这样的课程是否正确?问题是getPrice()类中的方法Item。每个项目都需要getPrice()。但我实际上无法回复一些东西。所以我点燃了this.getPrice()并获得ProductItem的价格。是否有更坚固/更好的解决方案?

class Item {
    String description;

    public Item(String description) {
        this.description = description;
    }

    double getPrice(){return this.getPrice();} //TODO Correct like this?
}

class ProductItem extends Item {
    int amount;
    double pricePerUnit;

    public ProductItem(String description, int amount, double pricePerUnit)         {
        super(description);
        this.amount = amount;
        this.pricePerUnit = pricePerUnit;
    }

    @Override
    double getPrice(){
        return amount * pricePerUnit;
    }
}

5 个答案:

答案 0 :(得分:13)

听起来Item应该是一个抽象类,getPrice()是一个抽象方法:

public abstract class Item {
    private final String description;

    public Item(String description) {
        this.description = description;
    }

    public abstract double getPrice();

    public String getDescription() {
        return description;
    }
}

这意味着你无法写

Item item = new Item("foo"); // Invalid, because Item is abstract

但你可以写:

Item item = new ProductItem("foo", 10, 2.0);
double p = item.getPrice(); // 20.0

您声明的每个具体(非抽象)子类都必须覆盖getPrice()并提供实现。

有关详细信息,请参阅abstract classes and methods section of the Java tutorial

答案 1 :(得分:4)

您需要做的是通过使?- maplist(append([_]), R, [[x,x],[b,c],[d,e,f]]). 方法摘要来制作Item课程abstract

这会强制你的子类实现特定的功能,如果不是,编译器就会给出错误。

您可以按照以下方式执行此操作:

getPrice

当子类忘记实现该函数时,您实现的实现实际上会导致对自身的循环(无限循环)调用。当子类实现了该函数时,它根本就不会被调用,因为它被子类覆盖。

答案 2 :(得分:1)

为什么不能制作getPrice()Item课程abstract,如下所示:

  public abstract class Item {
    private String description;

    public Item(final String description) {
        this.description = description;
    }

    protected abstract double getPrice();

    public String getDescription() {
        return description;
    }
}

并提供类扩展的实现,如下所示:

public class ProductItem extends Item {
    private int amount;
    private double pricePerUnit;

    public ProductItem(final String description, final int amount, final double pricePerUnit) {
        super(description);
        this.amount = amount;
        this.pricePerUnit = pricePerUnit;
    }

    @Override
    protected double getPrice() {
        return amount * pricePerUnit;
    }

}

答案 3 :(得分:0)

如果您错过了它,那么方法Item是递归的类getPrice()存在问题。所以这里new Item().getPrice()将导致StackOverflowException。

你可以把这个类变成抽象的。

abstract class Item {
  String description;
  public Item(String description) {
    this.description = description;
  }
  abstract double getPrice(); // force child classes to override this method
}

答案 4 :(得分:0)

double getPrice(){return this.getPrice();}基本上是一个无限循环。 你应该先设定这个价格。

class Item {
    String description;
    double price;
    public Item(String description) {
        this.description = description;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    double getPrice(){return this.price;} 
}