写这样的课程是否正确?问题是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;
}
}
答案 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;}
}