我有一个名为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
?
希望我的问题清楚。
答案 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(仅当您希望可以从代码的其他部分访问该字段时)。