我有这个练习来做解决问题的课程。我从面向对象编程的世界开始,这对我有很大帮助。我有这个解决方案,我想请您复习一下,我对它是否可以运行还有些怀疑,因为它告诉我不能修改Contract类: 合同类是我作为参考的
您要创建三种新型合同:
高级。在您寄出1000封电子邮件之前,不收取任何包裹费用,但最终金额增加了699欧元。
易碎。前100个易碎包裹不收费,仅发送100个易碎包裹后 对这种类型的电池收费一分之二。非易碎包装通常需要收费。大量的 最终金额。
飞机。不收取包裹费用。最终金额是创建合同时确定的金额,但是 以后可以修改。
考虑到我们不能修改现有的类,也不能执行关于如何实现它们的假设,请准备问题解决方案的类图并在Java中实现解决系统新需求所需的类。
public class Contract {
/ **
* Initialize a new contract for the Client c.
* /
public Contract (Client c) {
}
/ **
* Add Package p to the set of packages to be invoiced in a period of
* billing Package has methods that return boolean:
* isFragile () and isUrgent ().
* /
public void porte (Package p) {
}
/ **
* Returns the total invoice amount of a billing period.
* Contains fixed costs and charges for the packages sent.
* /
public double amount () {
}
/ **
* Reset the billing of a period.
* /
public void reset () {
}
}
我有
public class Package {
public Package (){
}
public boolean isFragile(){
return true;
}
public boolean isUrgent(){
return true;
}
}
public class Customer{
private int CustomerNumber;
public Customer(int CustomerNumber){
this.CustomerNumber= CustomerNumber;
}
public int getCustomerNumber(){
return CustomerNumber;
}
}
public class Premium extends Contract {
private int cont;
public Premium(Customer c) {
super(c);
cont = 0;
}
@Override
public void porte(Package p) {
cont++;
}
@Override
public double amount() {
if (cont <= 1000){
return 699;
}
return 0;
}
@Override
public void reset(){
cont = 0;
}
}
public class Fragil extends Contract {
private int cont;
public Fragile(Customer c) {
super(c);
cont = 0;
}
@Override
public void porte(Package p) {
if (p.isFragile()) {
cont++;
}
super.porte(p);
}
@Override
public double amount(){
return Math.floor((cont-100)*0.5);
}
@Override
public void reset(){
cont = 0;
}
}
public class Plane extends Contract{
public Plane(Customer c){
super(c);
}
public void setPrize(double prize){
super.prize = prize;
}
@Override
public double amount(){
return super.getPrize();
}
}
答案 0 :(得分:0)
由于这是练习,因此我建议继续并自己检查一下。 但是,我会给您一些线索和在您的方法中注意到的事情。
首先,您获得了继承权。 其次,我注意到您只计算包裹数(至少在Fragil合同中)而不是计算账单。因此,您应该确定每个Package的费用(您可以将这些信息作为Package的私有财产持有。
另外,编写此代码存在问题:
@Override
public double amount(){
return Math.floor((cont-100)*0.5);
}
如果cont <100怎么办?假设cont = 40。 然后,客户将必须支付Math.floor(-60 * 0.5)=-30而不是0。 因此,您将再次重写此逻辑。
另一件事, 如果包装数量为1000或更少,则固定价格为699,但是如果包装数量超过1000,那么客户不应该支付一分钱?感觉不对。
@Override
public double amount() {
if (cont <= 1000){
return 699;
}
return 0;
}
我想您应该在这种合同中将固定价格定为699,但是从包装号1001开始-您应该添加包装的成本(我之前谈到过的相同物业)。
希望我能帮上忙。