2015-10-02 89 views
3

写这样的类是否正确?有问题的是Item类中的方法getPrice()。每个项目需要有一个getPrice()。但我实际上不能回报什么。所以我发射this.getPrice()让我的价格ProductItem。是否有更坚实/更好设计的解决方案?返回类型的Java Inherance方法

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

'this.getPrice()'在'Item'中不存在。你只需要做'返回0'。覆盖类返回正确的东西,因为它是“覆盖” – kevintjuh93

回答

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了解更多详情。

0

只是在您错过了它的情况下,类存在问题,其中方法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

你所要做的就是让你的Itemabstract类,通过使getPrice方法抽象。

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

你可以做到这一点,如下所示:

class Item { 
    String description; 

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

    abstract double getPrice(); 
} 

你实际上给因执行圆形(无限循环)时,子类忘了实现该功能调用本身。当子类实现该函数时,它根本就不会被调用,因为它被子类覆盖。

1

你为什么不能让getPrice()Itemabstract,如下所示:

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

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