使用静态值继承

时间:2014-03-02 09:47:53

标签: java inheritance static final extends

我有一个名为Product的父类和一个名为Food的子类。每个Product都有一个交付时间。例如,对于Food,它是一天(我将其定义为一个int

我这样做了Product课:

public abstract class Product {    
    private int id;
    private String description;
    private double price;

    public Product(int id, String description, double price) {
        this.id = id;
        this.description = description;
        this.price = price;
    }.... and so on

我的Food课程如下:

public class Food extends Product{

    private Date expirationDate;
    private static final int DELIVERY = 1;

    public Food(int id, String description, double price, Date expirationDate) {
        super(id, description, price);
        this.expirationDate = expirationDate;
    }.. and so on

这是一种正确的方法吗?第二,如何从DELIVERY调用变量Food

希望我的问题清楚。

2 个答案:

答案 0 :(得分:1)

  

每件商品都有送货时间

我想您希望能够从外部访问任何产品的此信息。因此,您的Product类必须具有以下方法:

/**
 * Returns the delivery time for this product, in days
 */
public int getDeliveryTime()

现在你不得不怀疑。交货时间是每个产品的固定值,可以在施工时计算,之后不会更改,或者是从产品的其他字段计算的交货时间,还是服从公式。在第一种情况下,交付时间可以是Product类的字段,在构造函数中初始化:

private int deliveryTime;

protected Product(int id, String description, double price, int deliveryTime) {
    this.id = id;
    this.description = description;
    this.price = price;
    this.deliveryTime = deliveryTime;
}

/**
 * Returns the delivery time for this product, in days
 */
public int getDeliveryTime() {
    return deliveryTime;
}

在第二种情况下,(似乎是你的情况),你应该让每个子类按照自己的意愿计算交付时间:

/**
 * Returns the delivery time for this product, in days
 */
public abstract int getDeliveryTime();

在食物中,例如:

@Override
public int getDeliveryTime() {
    return 1; // always 1 for Food. Simplest formula ever
}

很酷的是,Product类和子类的用户不需要关心如何实现它。他们所知道的是每个Product都有一个getDeliveryTime()方法。它的实现方式与它们无关,并且可以在不更改调用者代码中的任何内容的情况下进行更改。这就是封装之美。

答案 1 :(得分:0)

如果每个产品都有交货时间,那么最好放入基类。

public abstract class Product {

private int id;
private String description;
private double price;

protected final int deliveryTime;

public Product(int id, String description, double price, int deliveryTime) {
    this.id = id;
    this.description = description;
    this.price = price;
    this.deliveryTime = deliveryTime;
}

public class Food extends Product{
public Food(int id, String description, double price, Date expirationDate) {
    super(id, description, price, 1);
    this.expirationDate = expirationDate;
}
//...
}

我在母班中保护了DELIVERY,但您也可以将其设为私有并拥有一个setter / getter(仅当您希望可以从代码的其他部分访问该字段时)。