2011-09-07 57 views
0

我有一項任務,我不太確定從哪裏開始。這是我應該做的。我需要幫助瞭解抽象類之間的關係

  • 創建一個抽象類DiscountPolicy。它將有一個抽象方法computeDiscount,它將返回購買給定數量的單個項目的折扣。該方法有兩個參數,count(int)和itemCost(float)
  • 從折扣策略派生類BulkDiscount。它將有一個構造函數,它有兩個參數,最小值和百分比。它將定義一個方法computeDiscount,以便如果購買某件商品的數量超過最小值,折扣就是該類別的百分比。 ComputeDiscount將返回總折扣。
  • 從DiscountPolicy派生類BuyNItemsGetOneFree。該類將有一個具有單個參數n的構造函數。此外,該類將定義方法computeDiscount,以便每個第n個項目都是空閒的。例如:
  • 如果n爲3且物料成本爲10美元。前兩項沒有折扣。項目3 - 5有10美元的折扣,第6件商品有20美元的折扣等。
  • 對於BuyNItemsGetOneFree - computeDiscount方法將收到購買的物品總數和物品成本,並返回總計折扣(如適用)。
  • 在您的主程序中,顯示computeDiscount方法適用於BulkDiscount和BuyNItemsGetOneFree類。

這就是我開始設置它的方式。我想讓我的方法和參數位於正確的位置,並且想知道我的老師想讓我通過哪些參數。

public class Ex1012 { 
    public static void main(String[] args) { 
    // TODO Auto-generated method stub 

     DiscountPolicy bulk = new BulkDiscount(); 

     System.out.println(); 

     DiscountPolicy bngo = new BuyNItemsGetOneFree();   
    } 
} 

public abstract class DiscountPolicy { 
    abstract void computeDiscount(int count, float itemCost){ 

     return discount; 
    } 
} 


public class BuyNItemsGetOneFree extends DiscountPolicy { 

    BuyNItemsGetOneFree() { 
    } 

    BuyNItemsGetOneFree(int n){ 
     DiscountPolicy.computeDiscount(int count, float itemCost); 
     //set n to a variable here?? 
     //calculations go here 
     //Where to set count and itemCost?? 
    } 
} 

public class BulkDiscount extends DiscountPolicy { 

    public BulkDiscount(int minimum, float percent){ 
     if (quantity > minimum){ 
      super.ComputeDiscount(int count, float itemCost); 
     //calculations go here 
      //Where to define count, itemCost, minimum, and percent?? 
     }  
    } 
} 

我只是擔心類和參數之間的關係本身,因爲我有困惑,一旦我有這樣的多個類。任何有識之士將不勝感激。謝謝!

+0

請確認後看起來不錯,在預覽窗口提交前。 – cwallenpoole

+0

方法參數由方法的調用者提供。在這種情況下,由於您在'main'中創建對象,因此可能會提供參數。 – birryree

回答

2

抽象方法可能不會有身體,讓你的computeDiscount(...)的定義應該是:

abstract void computeDiscount(int count, float itemCost); 

在每個擴展抽象類的具體類的,你那麼必須實現該方法。一般來說,抽象方法的行爲就像在接口中定義的方法(它們是聲明的,但沒有默認實現),但仍然存在差異(可以是保護或包私有,只能由子類實現)。

在大多數情況下,您有一個抽象類提供了一些默認邏輯,只需要子類填充一些依賴於具體實現的「洞」。

因此基本上,您將參數存儲爲BuyNItemsGetOneFreeBulkDiscount作爲實例變量,並在調用computeDiscount(...)時使用它們。你在構造函數中調用它,這很可能是錯誤的地方。我想你的主要應該直接調用你創建的對象的方法,例如

DiscountPolicy bngo = new BuyNItemsGetOneFree(5); 
double discountForFour = bngo.computDiscount(4,4.95f); 
double discountForFive = bngo.computDiscount(5,4.95f); 

請注意,您computeDiscount(...)方法應該返回一個值,根據您的任務:

...一個抽象方法computeDiscount即會回報折扣購買單個項目的給定數目的......

編輯:

//如果設置數量和itemCost?

正如我上面所說的,你不要「設置」(存儲)它們,而是隻將它們用於計算。

0

首先,抽象方法沒有身體。

其次,因爲它應該計算折扣它應該返回它,因此computeDiscount無效,它應該在你的情況下返回浮動。

所以DiscountPolicy應該像

public abstract class DiscountPolicy { 
    abstract float computeDiscount(int count, float itemCost); 
} 

而且你不能使用

DiscountPolicy.computeDiscount(int count, float itemCost); 

爲computeDiscount方法也不是一成不變的方法,它甚至不具體。

只是說明一點,java是區分大小寫的語言,因此您應該在聲明時使用它們,computeDiscount和ComputeDiscount是兩個不同的東西。

0

DiscountPolicy是一個基本的抽象類。在你的情況下,這給出了代表某種類型折扣的類的結構:所有這些類都應該有一個方法computeDiscount,並且此方法將根據各自的策略計算折扣。這是代表DiscountPolicy的所有類必須遵循的合約。

DiscountPolicy本身並沒有給出計算折扣的任何邏輯(沒有「默認策略」)。每個班級都必須提供自己的邏輯。您通過制定computeDiscount方法abstract來執行此操作。

java中的抽象方法沒有任何主體。這只是簽名:只是合同(結構)而沒有實施。

所以在你DiscountPolicy類computeDiscount應該像(注意;在簽名本身的結束也沒有{}):

abstract float computeDiscount(int count, float itemCost); 

而且,這種方法將返回折扣購買給定數量的單個項目的,所以返回類型應該是float,而不是void

BuyNItemsGetOneFreeBulkDiscount班,0是子類應該執行computeDiscount方法。這兩個子類的computeDiscount方法中的邏輯將基於批量折扣的折扣計算邏輯和購買n免費獲得1(此邏輯在您的練習中給出)而有所不同。

class BulkDiscount extends DiscountPolicy 
{ 
    //Same signature as computeDiscount of DiscountPolicy 
    //Not abstract, no semicolon at end of signature, has body. 
    //Also called "Concrete" method 
    float computeDiscount(int count, float itemCost) 
    { 
     //The logic as given in the exercise. 
     //Return the discount calculated by the logic 
    } 
} 

你測試這些爲(在Ex1012的,main法):

DiscountPolicy bulk = new BulkDiscount(); 
    float discount = bulk.computeDiscount(10, 1); //Data used to test 

    DiscountPolicy bngo = new BuyNItemsGetOneFree(); 
    float discount = bngo.computeDiscount()