6 changed files with 164 additions and 0 deletions
@ -0,0 +1,151 @@ |
|||||
|
package com.example.shape; |
||||
|
|
||||
|
public abstract class Shape { |
||||
|
public abstract double getArea(); |
||||
|
} |
||||
|
|
||||
|
class Circle extends Shape { |
||||
|
private double radius; |
||||
|
private static final double PI = 3.1415926; |
||||
|
|
||||
|
public Circle(double radius) { |
||||
|
if (radius <= 0) { |
||||
|
throw new IllegalArgumentException("半径必须大于0"); |
||||
|
} |
||||
|
this.radius = radius; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public double getArea() { |
||||
|
return PI * radius * radius; |
||||
|
} |
||||
|
|
||||
|
public double getRadius() { |
||||
|
return radius; |
||||
|
} |
||||
|
|
||||
|
public void setRadius(double radius) { |
||||
|
if (radius <= 0) { |
||||
|
throw new IllegalArgumentException("半径必须大于0"); |
||||
|
} |
||||
|
this.radius = radius; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
class Rectangle extends Shape { |
||||
|
private double length; |
||||
|
private double width; |
||||
|
|
||||
|
public Rectangle(double length, double width) { |
||||
|
if (length <= 0 || width <= 0) { |
||||
|
throw new IllegalArgumentException("长和宽必须大于0"); |
||||
|
} |
||||
|
this.length = length; |
||||
|
this.width = width; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public double getArea() { |
||||
|
return length * width; |
||||
|
} |
||||
|
|
||||
|
public double getLength() { |
||||
|
return length; |
||||
|
} |
||||
|
|
||||
|
public void setLength(double length) { |
||||
|
if (length <= 0) { |
||||
|
throw new IllegalArgumentException("长必须大于0"); |
||||
|
} |
||||
|
this.length = length; |
||||
|
} |
||||
|
|
||||
|
public double getWidth() { |
||||
|
return width; |
||||
|
} |
||||
|
|
||||
|
public void setWidth(double width) { |
||||
|
if (width <= 0) { |
||||
|
throw new IllegalArgumentException("宽必须大于0"); |
||||
|
} |
||||
|
this.width = width; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
class Triangle extends Shape { |
||||
|
private double a; |
||||
|
private double b; |
||||
|
private double c; |
||||
|
|
||||
|
public Triangle(double a, double b, double c) { |
||||
|
// 校验三边>0,且满足三角形三边关系(任意两边之和>第三边)
|
||||
|
if (a <= 0 || b <= 0 || c <= 0) { |
||||
|
throw new IllegalArgumentException("边长必须大于0"); |
||||
|
} |
||||
|
if (a + b <= c || a + c <= b || b + c <= a) { |
||||
|
throw new IllegalArgumentException("不满足三角形三边关系,无法构成三角形"); |
||||
|
} |
||||
|
this.a = a; |
||||
|
this.b = b; |
||||
|
this.c = c; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public double getArea() { |
||||
|
double p = (a + b + c) / 2; |
||||
|
return Math.sqrt(p * (p - a) * (p - b) * (p - c)); |
||||
|
} |
||||
|
|
||||
|
public double getA() { |
||||
|
return a; |
||||
|
} |
||||
|
|
||||
|
public void setA(double a) { |
||||
|
if (a <= 0) { |
||||
|
throw new IllegalArgumentException("边长必须大于0"); |
||||
|
} |
||||
|
this.a = a; |
||||
|
if (a + b <= c || a + c <= b || b + c <= a) { |
||||
|
throw new IllegalArgumentException("不满足三角形三边关系,无法构成三角形"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public double getB() { |
||||
|
return b; |
||||
|
} |
||||
|
|
||||
|
public void setB(double b) { |
||||
|
if (b <= 0) { |
||||
|
throw new IllegalArgumentException("边长必须大于0"); |
||||
|
} |
||||
|
this.b = b; |
||||
|
if (a + b <= c || a + c <= b || b + c <= a) { |
||||
|
throw new IllegalArgumentException("不满足三角形三边关系,无法构成三角形"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public double getC() { |
||||
|
return c; |
||||
|
} |
||||
|
|
||||
|
public void setC(double c) { |
||||
|
if (c <= 0) { |
||||
|
throw new IllegalArgumentException("边长必须大于0"); |
||||
|
} |
||||
|
this.c = c; |
||||
|
if (a + b <= c || a + c <= b || b + c <= a) { |
||||
|
throw new IllegalArgumentException("不满足三角形三边关系,无法构成三角形"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
class ShapeUtil { |
||||
|
public static void printArea(Shape shape) { |
||||
|
if (shape == null) { |
||||
|
System.out.println("图形对象不能为空!"); |
||||
|
return; |
||||
|
} |
||||
|
double area = shape.getArea(); |
||||
|
System.out.printf("该图形的面积为:%.2f%n", area); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,2 @@ |
|||||
|
[LocalizedFileNames] |
||||
|
Shape.java=@Shape.java,0 |
||||
@ -0,0 +1,3 @@ |
|||||
|
1.本次重构通过抽象类+继承实现了代码的统一管理,解决了原独立类无法统一处理的问题,体现了面向对象多态的优势 |
||||
|
2.代码中增加了参数校验,避免了非法数据导致的计算错误,提升了健壮性 |
||||
|
3.工具类 ShapeUtil 通过多态实现了开闭原则:新增图形类(如正方形)无需修改工具类,只需新增 Shape 子类即可,符合面向对象设计原则。 |
||||
@ -0,0 +1,8 @@ |
|||||
|
AI使用情况: |
||||
|
1.通过AI辅助更深刻地理解了抽象类,继承和多态的概念,以及Circle,Rectangle,Triangle三个子类如何继承并实现getArea方法 |
||||
|
2.用AI梳理了类的结构和UML类图的含义,知道我正确使用了@override方法 |
||||
|
3.利用AI检查程序漏洞,润色代码 |
||||
|
|
||||
|
组合VS继承问题: |
||||
|
继承是一种“is-a”的关系,具有高耦合度,编译期确定继承关系,灵活性较差,适用于类之间存在明确的父子关系。 |
||||
|
组合是一种“has-a”的关系,耦合度低,但运行期可动态替换组合对象,灵活性高,适用于从属关系 |
||||
|
After Width: | Height: | Size: 346 KiB |
|
After Width: | Height: | Size: 206 KiB |
Loading…
Reference in new issue