MST

星途 面试题库

面试题:TypeScript 抽象类在继承体系中的设计优化

假设你正在开发一个图形绘制库,其中有一个抽象类 `Shape` 作为所有图形类的基类。请设计 `Shape` 抽象类以及至少两个具体子类(如 `Circle` 和 `Rectangle`),要求通过合理的抽象类设计来优化继承体系,包括但不限于抽象属性、抽象方法的设置,同时说明这样设计如何提高代码的可维护性和扩展性。
31.3万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

Shape 抽象类设计

abstract class Shape {
    // 抽象属性(这里以颜色为例,不同图形可能有不同颜色表示方式)
    protected String color;

    // 构造函数
    public Shape(String color) {
        this.color = color;
    }

    // 抽象方法:计算面积
    public abstract double calculateArea();

    // 抽象方法:绘制图形
    public abstract void draw();
}

Circle 子类设计

class Circle extends Shape {
    private double radius;

    public Circle(String color, double radius) {
        super(color);
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;
    }

    @Override
    public void draw() {
        System.out.println("绘制一个颜色为 " + color + " 的圆,半径为 " + radius);
    }
}

Rectangle 子类设计

class Rectangle extends Shape {
    private double width;
    private double height;

    public Rectangle(String color, double width, double height) {
        super(color);
        this.width = width;
        this.height = height;
    }

    @Override
    public double calculateArea() {
        return width * height;
    }

    @Override
    public void draw() {
        System.out.println("绘制一个颜色为 " + color + " 的矩形,宽为 " + width + ",高为 " + height);
    }
}

设计对可维护性和扩展性的提升

  1. 可维护性
    • 抽象方法和属性:通过在抽象类 Shape 中定义抽象方法(如 calculateAreadraw)和抽象属性(如 color),强制所有子类遵循统一的接口规范。当需要修改图形计算面积或绘制方式的逻辑时,只需要在相应子类中修改,而不会影响到其他子类。例如,如果要修改圆的绘制方式,只需要修改 Circle 类中的 draw 方法,而 Rectangle 类不受影响。
    • 代码复用:抽象类中的构造函数初始化了 color 属性,子类通过 super 关键字复用了这部分代码,避免了在每个子类中重复编写属性初始化逻辑,使得代码更简洁,易于维护。
  2. 扩展性
    • 添加新图形:如果要添加新的图形类(如三角形 Triangle),只需要继承 Shape 抽象类,并实现其抽象方法即可。例如:
class Triangle extends Shape {
    private double base;
    private double height;

    public Triangle(String color, double base, double height) {
        super(color);
        this.base = base;
        this.height = height;
    }

    @Override
    public double calculateArea() {
        return 0.5 * base * height;
    }

    @Override
    public void draw() {
        System.out.println("绘制一个颜色为 " + color + " 的三角形,底为 " + base + ",高为 " + height);
    }
}
- **统一管理**:在使用图形类的地方,可以通过 `Shape` 类型来引用不同的具体图形对象,利用多态性实现统一的操作。例如:
Shape circle = new Circle("红色", 5);
Shape rectangle = new Rectangle("蓝色", 4, 6);
Shape triangle = new Triangle("绿色", 3, 8);

Shape[] shapes = {circle, rectangle, triangle};
for (Shape shape : shapes) {
    System.out.println("面积: " + shape.calculateArea());
    shape.draw();
}

这样,当添加新的图形类时,无需修改遍历和操作图形的主代码,只需要关注新图形类本身的实现,提高了系统的扩展性。