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