面试题答案
一键面试- 在
Shape
抽象类中添加抽象方法:- 在
Shape
抽象类中添加一个抽象方法rotate(double angle)
,用于定义旋转操作。因为不同的图形(如圆形、矩形)旋转的具体实现可能不同,所以将其定义为抽象方法,由具体的子类来实现。
public abstract class Shape { public abstract void rotate(double angle); }
- 在
- 在具体子类中实现旋转方法:
- 圆形(
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}; } }
- 圆形(
- 继承结构调整:
- 由于只是在
Shape
抽象类中添加了抽象方法,并没有改变原有的继承结构,即Circle
和Rectangle
等具体图形类仍然继承自Shape
抽象类。这种方式符合开闭原则,尽量不破坏现有代码结构,同时为图形添加了旋转功能。
- 由于只是在
通过以上步骤,在不破坏现有代码结构的前提下,为图形绘制框架中的图形添加了旋转功能。