MST

星途 面试题库

面试题:Java抽象类在图形绘制框架中的优化应用

在一个图形绘制框架中,已经有一个抽象类Shape用于表示各种图形,如圆形(Circle)、矩形(Rectangle)等继承自该抽象类。现在需要添加对图形旋转功能的支持,要求尽量不破坏现有代码结构,使用Java抽象类相关知识说明如何实现,包括可能涉及的抽象方法、新的继承结构调整等。
31.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. Shape抽象类中添加抽象方法
    • Shape抽象类中添加一个抽象方法rotate(double angle),用于定义旋转操作。因为不同的图形(如圆形、矩形)旋转的具体实现可能不同,所以将其定义为抽象方法,由具体的子类来实现。
    public abstract class Shape {
        public abstract void rotate(double angle);
    }
    
  2. 在具体子类中实现旋转方法
    • 圆形(Circle:圆形的旋转在二维平面上相对简单,因为其中心对称,旋转角度通常不会改变其外观形状,但是可能会涉及到坐标系的变化。假设圆心坐标为(x, y),在二维笛卡尔坐标系下,以原点为中心旋转angle角度的公式为:
      • (x' = x\cos\theta - y\sin\theta)
      • (y' = x\sin\theta + y\cos\theta)
    public class Circle extends Shape {
        private double x;
        private double y;
        private double radius;
        public Circle(double x, double y, double radius) {
            this.x = x;
            this.y = y;
            this.radius = radius;
        }
        @Override
        public void rotate(double angle) {
            double newX = x * Math.cos(angle) - y * Math.sin(angle);
            double newY = x * Math.sin(angle) + y * Math.cos(angle);
            x = newX;
            y = newY;
        }
    }
    
    • 矩形(Rectangle:矩形的旋转较为复杂,需要考虑矩形的四个顶点坐标。假设矩形的左上角顶点坐标为(x1, y1),右下角顶点坐标为(x2, y2),先计算出矩形的中心坐标(cx, cy),然后将四个顶点相对于中心进行旋转。
    public class Rectangle extends Shape {
        private double x1;
        private double y1;
        private double x2;
        private double y2;
        public Rectangle(double x1, double y1, double x2, double y2) {
            this.x1 = x1;
            this.y1 = y1;
            this.x2 = x2;
            this.y2 = y2;
        }
        @Override
        public void rotate(double angle) {
            double cx = (x1 + x2) / 2;
            double cy = (y1 + y2) / 2;
            double[] newX1 = rotatePoint(x1, y1, cx, cy, angle);
            double[] newX2 = rotatePoint(x2, y2, cx, cy, angle);
            x1 = newX1[0];
            y1 = newX1[1];
            x2 = newX2[0];
            y2 = newX2[1];
        }
        private double[] rotatePoint(double x, double y, double cx, double cy, double angle) {
            double newX = (x - cx) * Math.cos(angle) - (y - cy) * Math.sin(angle) + cx;
            double newY = (x - cx) * Math.sin(angle) + (y - cy) * Math.cos(angle) + cy;
            return new double[]{newX, newY};
        }
    }
    
  3. 继承结构调整
    • 由于只是在Shape抽象类中添加了抽象方法,并没有改变原有的继承结构,即CircleRectangle等具体图形类仍然继承自Shape抽象类。这种方式符合开闭原则,尽量不破坏现有代码结构,同时为图形添加了旋转功能。

通过以上步骤,在不破坏现有代码结构的前提下,为图形绘制框架中的图形添加了旋转功能。