7 changed files with 264 additions and 0 deletions
@ -0,0 +1,38 @@ |
|||
/** |
|||
* 圆形类,继承自抽象图形类Shape |
|||
* 实现圆形的面积计算逻辑:面积 = π * 半径² |
|||
*/ |
|||
public class Circle extends Shape { |
|||
// 圆形的半径
|
|||
private double radius; |
|||
|
|||
/** |
|||
* 构造方法:初始化圆形半径 |
|||
* @param radius 半径(需大于0,此处做简单校验) |
|||
*/ |
|||
public Circle(double radius) { |
|||
if (radius <= 0) { |
|||
throw new IllegalArgumentException("半径必须大于0!"); |
|||
} |
|||
this.radius = radius; |
|||
} |
|||
|
|||
/** |
|||
* 实现抽象方法:计算圆形面积 |
|||
* @return 圆形的面积 |
|||
*/ |
|||
@Override |
|||
public double getArea() { |
|||
// Math.PI 是Java内置的π常量,精度更高
|
|||
return Math.PI * radius * radius; |
|||
} |
|||
|
|||
// Getter方法(可选,便于查看/修改半径)
|
|||
public double getRadius() { |
|||
return radius; |
|||
} |
|||
|
|||
public void setRadius(double radius) { |
|||
this.radius = radius; |
|||
} |
|||
} |
|||
@ -0,0 +1,77 @@ |
|||
|
|||
# AI交互记录 - 图形面积计算器项目 |
|||
|
|||
## 项目概述 |
|||
实现一个基于面向对象思想的图形面积计算器,支持圆形、矩形、三角形的面积计算,体现抽象、继承和多态特性。 |
|||
|
|||
--- |
|||
|
|||
## 交互过程 |
|||
|
|||
### 1. 需求分析阶段 |
|||
**用户提问:** 需要设计一个图形面积计算系统,要求使用面向对象的抽象和继承特性。 |
|||
|
|||
**AI建议:** |
|||
- 创建抽象基类 `Shape`,定义统一的 `getArea()` 方法 |
|||
- 具体图形类(Circle、Rectangle、Triangle)继承 Shape 并实现各自的面积计算逻辑 |
|||
- 使用工具类 `ShapeUtil` 统一管理面积打印,体现多态性 |
|||
|
|||
--- |
|||
|
|||
### 2. 核心设计决策 |
|||
|
|||
#### Q1: 为什么使用抽象类而不是接口? |
|||
**AI回答:** |
|||
- 抽象类可以包含部分通用实现和成员变量 |
|||
- 更符合"是一种(is-a)"的关系建模 |
|||
- 便于未来扩展共享行为 |
|||
|
|||
#### Q2: 如何保证输入参数的合法性? |
|||
**AI建议:** |
|||
在各图形类的构造方法中添加参数校验: |
|||
--- |
|||
|
|||
### 3. 代码实现要点 |
|||
|
|||
#### Shape.java(抽象基类) |
|||
- 定义抽象方法 `getArea()` 和 `draw()` |
|||
- 强制子类实现面积计算逻辑 |
|||
|
|||
#### Circle.java |
|||
- 面积公式:π × r² |
|||
- 使用 `Math.PI` 提高精度 |
|||
|
|||
#### Rectangle.java |
|||
- 面积公式:长 × 宽 |
|||
- 提供 getter/setter 便于访问属性 |
|||
|
|||
#### Triangle.java |
|||
- 面积公式:底 × 高 / 2 |
|||
- 构造时校验底和高必须大于0 |
|||
|
|||
#### ShapeUtil.java |
|||
- 静态方法 `printArea(Shape shape)` 接收任意 Shape 子类 |
|||
- 利用多态自动调用对应子类的 `getArea()` 方法 |
|||
|
|||
#### TestShape.java |
|||
- 创建三种图形实例,向上转型为 Shape 类型 |
|||
- 统一调用工具类方法,验证多态效果 |
|||
|
|||
--- |
|||
|
|||
### 4. 关键技术点总结 |
|||
|
|||
| 概念 | 应用位置 | 说明 | |
|||
|------|---------|------| |
|||
| **抽象** | Shape类 | 定义规范,不关心具体实现 | |
|||
| **继承** | Circle/Rectangle/Triangle | 复用Shape的结构 | |
|||
| **多态** | ShapeUtil.printArea() | 同一方法处理不同图形 | |
|||
| **封装** | 私有属性+getter/setter | 保护数据安全性 | |
|||
| **异常处理** | 构造方法校验 | 防止非法参数 | |
|||
|
|||
--- |
|||
|
|||
### 5. 运行结果示例 |
|||
===== 圆形面积 ===== 该图形的面积为:78.54 |
|||
===== 矩形面积 ===== 该图形的面积为:12.00 |
|||
===== 三角形面积 ===== 该图形的面积为:12.00 |
|||
@ -0,0 +1,48 @@ |
|||
/** |
|||
* 矩形类,继承自抽象图形类Shape |
|||
* 实现矩形的面积计算逻辑:面积 = 长 * 宽 |
|||
*/ |
|||
public class Rectangle extends Shape { |
|||
// 矩形的长和宽
|
|||
private double length; |
|||
private double width; |
|||
|
|||
/** |
|||
* 构造方法:初始化矩形的长和宽 |
|||
* @param length 长(需大于0) |
|||
* @param width 宽(需大于0) |
|||
*/ |
|||
public Rectangle(double length, double width) { |
|||
if (length <= 0 || width <= 0) { |
|||
throw new IllegalArgumentException("长和宽必须大于0!"); |
|||
} |
|||
this.length = length; |
|||
this.width = width; |
|||
} |
|||
|
|||
/** |
|||
* 实现抽象方法:计算矩形面积 |
|||
* @return 矩形的面积 |
|||
*/ |
|||
@Override |
|||
public double getArea() { |
|||
return length * width; |
|||
} |
|||
|
|||
// Getter/Setter方法(可选)
|
|||
public double getLength() { |
|||
return length; |
|||
} |
|||
|
|||
public void setLength(double length) { |
|||
this.length = length; |
|||
} |
|||
|
|||
public double getWidth() { |
|||
return width; |
|||
} |
|||
|
|||
public void setWidth(double width) { |
|||
this.width = width; |
|||
} |
|||
} |
|||
@ -0,0 +1,14 @@ |
|||
/** |
|||
* 图形抽象类 |
|||
* 定义所有图形的公共行为(计算面积),体现面向对象的抽象特性 |
|||
*/ |
|||
public abstract class Shape { |
|||
/** |
|||
* 抽象方法:计算图形面积 |
|||
* 由具体子类(圆形、矩形、三角形)实现各自的面积计算逻辑 |
|||
* @return 图形的面积(double类型) |
|||
*/ |
|||
public abstract double getArea(); |
|||
|
|||
public abstract void draw(); |
|||
} |
|||
@ -0,0 +1,16 @@ |
|||
/** |
|||
* 图形工具类 |
|||
* 提供统一的面积打印方法,支持所有继承自Shape的图形子类 |
|||
*/ |
|||
public class ShapeUtil { |
|||
/** |
|||
* 打印任意图形的面积 |
|||
* @param shape 图形对象(可以是Circle/Rectangle/Triangle的实例,体现多态) |
|||
*/ |
|||
public static void printArea(Shape shape) { |
|||
// 调用子类重写的getArea()方法,自动适配不同图形
|
|||
double area = shape.getArea(); |
|||
// 格式化输出,保留2位小数,更易读
|
|||
System.out.printf("该图形的面积为:%.2f%n", area); |
|||
} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
/** |
|||
* 测试类:验证图形面积计算器的功能 |
|||
*/ |
|||
public class TestShape { |
|||
public static void main(String[] args) { |
|||
// 1. 创建圆形(半径5)
|
|||
Shape circle = new Circle(5); |
|||
// 2. 创建矩形(长4,宽3)
|
|||
Shape rectangle = new Rectangle(4, 3); |
|||
// 3. 创建三角形(底6,高4)
|
|||
Shape triangle = new Triangle(6, 4); |
|||
|
|||
// 调用工具类打印面积(统一处理所有图形)
|
|||
System.out.println("===== 圆形面积 ====="); |
|||
ShapeUtil.printArea(circle); |
|||
|
|||
System.out.println("===== 矩形面积 ====="); |
|||
ShapeUtil.printArea(rectangle); |
|||
|
|||
System.out.println("===== 三角形面积 ====="); |
|||
ShapeUtil.printArea(triangle); |
|||
} |
|||
} |
|||
@ -0,0 +1,48 @@ |
|||
/** |
|||
* 三角形类,继承自抽象图形类Shape |
|||
* 实现三角形的面积计算逻辑:面积 = 底 * 高 / 2 |
|||
*/ |
|||
public class Triangle extends Shape { |
|||
// 三角形的底和高
|
|||
private double base; |
|||
private double height; |
|||
|
|||
/** |
|||
* 构造方法:初始化三角形的底和高 |
|||
* @param base 底(需大于0) |
|||
* @param height 高(需大于0) |
|||
*/ |
|||
public Triangle(double base, double height) { |
|||
if (base <= 0 || height <= 0) { |
|||
throw new IllegalArgumentException("底和高必须大于0!"); |
|||
} |
|||
this.base = base; |
|||
this.height = height; |
|||
} |
|||
|
|||
/** |
|||
* 实现抽象方法:计算三角形面积 |
|||
* @return 三角形的面积 |
|||
*/ |
|||
@Override |
|||
public double getArea() { |
|||
return (base * height) / 2; |
|||
} |
|||
|
|||
// Getter/Setter方法(可选)
|
|||
public double getBase() { |
|||
return base; |
|||
} |
|||
|
|||
public void setBase(double base) { |
|||
this.base = base; |
|||
} |
|||
|
|||
public double getHeight() { |
|||
return height; |
|||
} |
|||
|
|||
public void setHeight(double height) { |
|||
this.height = height; |
|||
} |
|||
} |
|||
Loading…
Reference in new issue