2014-03-02 108 views
-1

我有一個父類稱爲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 

這是這樣做的正確方法?第二,如何從Food撥打我的變量DELIVERY

希望我在我的問題中很清楚。

+1

「這是做這件事的正確方法嗎?」 - 做什麼?遺產?你做到了。 「我怎樣才能從食物中調用我的變量'DELIVERY'」 - 只是使用它。它是在那裏定義的,所以沒有問題來提及它。 – AlexR

+0

@AlexR:您如何從父母處訪問子字段? – mok

+0

我是否必須以某種方式在父類中指定一個變量以用於交付? – ddvink

回答

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

我的交付55保護在母親類,但你不妨把它變成私有,並有一個setter /吸氣(僅當您希望該字段爲能夠與其他訪問部分代碼儘管)。

1

每個產品都有一個交貨期

我猜你希望能夠從外部訪問這些信息,對於任何產品。所以你的產品類必須有如下方法:

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

現在你不得不懷疑。交付時間是每個產品的固定價值,可以在施工時計算,之後不會改變,或者交貨時間是從產品的其他領域計算出來的,或服從公式。在第一種情況下,交貨時間可以是產品類的字段,在構造函數初始化:

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 
} 

很酷的事情是,該產品類的用戶和子類並不需要關心這是怎麼回事imple mented。他們只知道每個Product都有一個getDeliveryTime()方法。它的實現方式與它們無關,並且可以在不更改調用者代碼中的任何內容的情況下進行更改。這就是封裝的美麗。