Java 继承 UML 怎么画
在 Java 中,使用 UML(Unified Modeling Language)绘制继承关系图是一种常见的做法,用于描述类之间的继承关系。本文将介绍如何使用 UML 绘制继承关系图,并提供一个具体的示例来解决一个问题。
UML 继承关系图的基本概念
在 UML 中,继承关系用带箭头的实线表示,箭头指向父类,子类位于箭头的另一端。继承关系图可以显示类的继承关系,并且可以包含类的属性和方法。
示例问题
假设我们要设计一个简单的图形库,其中包含三种图形:圆形、矩形和三角形。这些图形都具有公共的属性和方法,例如面积和周长的计算。我们将使用继承来实现这些图形类的共享代码。
UML 继承关系图
下面是一个使用 UML 绘制的继承关系图:
erDiagram
class Diagram {
- shapes: Shape[]
+ addShape(shape: Shape): void
+ removeShape(shape: Shape): void
+ drawShapes(): void
}
class Shape {
+ calculateArea(): double
+ calculatePerimeter(): double
}
class Circle {
- radius: double
+ calculateArea(): double
+ calculatePerimeter(): double
}
class Rectangle {
- width: double
- height: double
+ calculateArea(): double
+ calculatePerimeter(): double
}
class Triangle {
- sideA: double
- sideB: double
- sideC: double
+ calculateArea(): double
+ calculatePerimeter(): double
}
Diagram --> "*" Shape
Circle --|> Shape
Rectangle --|> Shape
Triangle --|> Shape
上面的 UML 继承关系图描述了三种图形类(Circle、Rectangle 和 Triangle)分别继承自 Shape 类,并且 Diagram 类包含一个 Shape 对象数组。其中,Shape 类定义了所有图形类共有的属性和方法,例如计算面积和周长的方法。
Java 代码实现示例
下面是用 Java 实现上述 UML 继承关系图的示例代码:
// Shape.java
abstract class Shape {
public abstract double calculateArea();
public abstract double calculatePerimeter();
}
// Circle.java
class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
@Override
public double calculatePerimeter() {
return 2 * Math.PI * radius;
}
}
// Rectangle.java
class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double calculateArea() {
return width * height;
}
@Override
public double calculatePerimeter() {
return 2 * (width + height);
}
}
// Triangle.java
class Triangle extends Shape {
private double sideA;
private double sideB;
private double sideC;
public Triangle(double sideA, double sideB, double sideC) {
this.sideA = sideA;
this.sideB = sideB;
this.sideC = sideC;
}
@Override
public double calculateArea() {
double p = (sideA + sideB + sideC) / 2;
return Math.sqrt(p * (p - sideA) * (p - sideB) * (p - sideC));
}
@Override
public double calculatePerimeter() {
return sideA + sideB + sideC;
}
}
// Diagram.java
class Diagram {
private Shape[] shapes;
public Diagram() {
shapes = new Shape[0];
}
public void addShape(Shape shape) {
Shape[] newShapes = new Shape[shapes.length + 1];
System.arraycopy(shapes, 0, newShapes, 0, shapes.length);
newShapes[shapes.length] = shape;
shapes = newShapes;
}
public void removeShape(Shape shape) {
Shape[] newShapes = new Shape[shapes.length - 1];
int index = 0;
for (int i = 0; i < shapes.length; i++) {
if (shapes[i] != shape) {
new