【任务一】:假设默认长度单位为米,编写一个计算为各种形状着色花费的程序。
要求:
- 编写 BorderColorable 接口,要求:
- 具有方法 void paintBorder(),在实现类中该方法需要输出“已经将什么形状的边着色”。
- 方法 boolean isBorderPainted(),返回形状的边是否已经着色。
- 编写 SolidColorable 接口,要求:
- 具有方法 void paintShape(),在实现类中该方法需要输出“已经将什么形状进行着色”。
- 方法 boolean isShapePainted(),返回形状是否已经着色。
- Shape2D 是一个抽象类,是所有形状的父类:
Shape2D 具有抽象方法 double getPerimeter()和 double getArea()分别表示获取形状的周长和面积。
- 其中圆(Circle),三角形(Triangle)和长方形(Rectangle)均继承自 Shape2D 类,而 Square 继承自 Rectangle 类。
- Circle 实现了 BorderColorable 接口,Triangle 实现了 SolidColorable 接口,而 Rectangle 同时实现了 BorderColorable接口和 SolidColorable 接口。
- CostCalculator 类用来计算为边着色和为形状着色所消耗的花费。
- 构造函数 CostCalculator(double borderCost, double solidCost),其中 borderCost 表示画 1 米的边需要的单价,
solidCost 表示画 1 平方米的边需要消耗的单价。 - double calculate(Shape2D shape)用来计算实际为形状 shape 着色需要的花费。
- 形状着色的花费计算只计算已经着色的部分,且花费总额为边着色和为形状着色的花费的总和。
- 写一个测试类测试你的程序。
首先,让我们来分析一下,要写接口和抽象类,基本语句应该都清楚(那么就po几段代码来感受下,抽象类如何定义以及记住:抽象类里面的方法必须实现
/**
* @Author:苘山楂树
* @Description:Shape2D抽象类,是所有形状的父类
* @Date: 2019/10/26
* @Modified By:苘山楂树
*/
public abstract class Shape2D {
public abstract double getPerimeter(); //计算周长
public abstract double getArea(); //计算面积
}
然后就是抽象类里面的其他子类了,由于Rectangle和Square比较特殊,故po出代码看看之前写Square的时候出现了什么问题.
/**
* @Author:苘山楂树
* @Description:矩形
* @Date: 2019/10/26
* @Modified By:苘山楂树
*/
public class Rectangle extends Shape2D implements BorderColorable,SolidColorable{
private double length;
private double width;
private boolean isShapePainted = false;
private boolean isSlidePainted = false;
public Rectangle(double length, double width) {
this.length = length;