我需要帮助理解抽象类之间的关系

时间:2011-09-07 11:45:01

标签: java abstract

我有一项任务,我不太清楚从哪里开始。这就是我应该做的。

  • 创建一个抽象类DiscountPolicy。它将有一个抽象方法computeDiscount,它将返回购买给定数量的单个项目的折扣。该方法有两个参数:count(int)和itemCost(float)
  • 从折扣政策中导出类BulkDiscount。它将有一个构造函数,它有两个参数,minimum和percent。它将定义一个方法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??
        }       
    }   
}

我只是担心类和参数本身之间的关系,因为一旦我有多个这样的类,我会感到困惑。任何见解将不胜感激。谢谢!

4 个答案:

答案 0 :(得分: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将返回购买给定数量的单个项目的折扣......

编辑:

  

//在哪里设置count和itemCost ??

正如我上面所说,你不会“设置”(存储)它们,而只是将它们用于计算。

答案 1 :(得分:1)

您需要查看如何定义抽象方法。抽象方法没有正文“{}”。它应该在子类中定义。当基类调用抽象方法时,子类通常会计算折扣。

http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

答案 2 :(得分:0)

首先,抽象方法没有正文。

其次因为它应该计算折扣它应该返回它所以computeDiscount canot是无效的,它应该在你的情况下返回浮点数。

所以DiscountPolicy应该看起来像

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

此外,您无法使用

DiscountPolicy.computeDiscount(int count, float itemCost);

由于computeDiscount方法不是静态方法,它甚至不具体。

请注意,java是区分大小写的语言,所以你应该使用你声明它们的东西,computeDiscount和ComputeDiscount是两个不同的东西。

答案 3 :(得分:0)

DiscountPolicy是一个基本的抽象类。在您的情况下,这给出了表示某种类型的折扣的类的结构:所有这些类都应该有一个方法computeDiscount,并且此方法将根据相应的策略计算折扣。这是一个代表DiscountPolicy的所有类必须遵循的合同。

DiscountPolicy本身并没有给出任何计算折扣的逻辑(没有“默认政策”)。每个班级都必须提供自己的逻辑。您可以通过computeDiscount方法abstract强制执行此操作。

java中的抽象方法没有任何正文。它只是签名:只是合同(结构)而没有实施。

所以DiscountPolicy类中的computeDiscount应该是这样的(注意签名本身末尾的;。也没有{}):

abstract float computeDiscount(int count, float itemCost);

此外,此方法将返回购买给定数量的单个商品的折扣,因此返回类型应为float而不是void < / p>

作为BuyNItemsGetOneFree 的子类的BulkDiscountDiscountPolicy类应该实现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()