我有一项任务,我不太清楚从哪里开始。这就是我应该做的。
这就是我开始设置它的方式。我想让我的方法和参数都在正确的位置,我想知道我在哪里定义了老师希望我传递的参数。
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 :(得分:2)
抽象方法可能没有正文,因此您对computeDiscount(...)
的定义应为:
abstract void computeDiscount(int count, float itemCost);
在扩展抽象类的每个具体类中,您必须实现该方法。通常,抽象方法的行为类似于在某种程度上在接口中定义的方法(它们是声明但没有默认实现),但仍然存在差异(可以保护或包私有,只能通过子类等实现)。
在大多数情况下,你有一个提供一些默认逻辑的抽象类,只需要子类填写一些依赖于具体实现的“漏洞”。
基本上,您将参数存储为BuyNItemsGetOneFree
和BulkDiscount
作为实例变量,并在调用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
的子类的BulkDiscount
和DiscountPolicy
类应该实现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()