面试题答案
一键面试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);
}
}
设计对可维护性和扩展性的提升
- 可维护性:
- 抽象方法和属性:通过在抽象类
Shape
中定义抽象方法(如calculateArea
和draw
)和抽象属性(如color
),强制所有子类遵循统一的接口规范。当需要修改图形计算面积或绘制方式的逻辑时,只需要在相应子类中修改,而不会影响到其他子类。例如,如果要修改圆的绘制方式,只需要修改Circle
类中的draw
方法,而Rectangle
类不受影响。 - 代码复用:抽象类中的构造函数初始化了
color
属性,子类通过super
关键字复用了这部分代码,避免了在每个子类中重复编写属性初始化逻辑,使得代码更简洁,易于维护。
- 抽象方法和属性:通过在抽象类
- 扩展性:
- 添加新图形:如果要添加新的图形类(如三角形
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();
}
这样,当添加新的图形类时,无需修改遍历和操作图形的主代码,只需要关注新图形类本身的实现,提高了系统的扩展性。