我正在开发一个2D几何游戏,其中我有一个基本的抽象类Figure
,不同的实现从中继承(例如CircleFigure
,PolygonalFigure
)。我需要Figure
中的一个抽象方法来检查这些数字中的两个是否相交,让它的签名为public abstract boolean collision(Figure that)
。
问题是每对类型的数字都需要不同的方法实现;即对于两个圆圈,我会检查两个半径的总和是否小于圆心之间的距离。但是对于圆形和多边形,我会使用完全不同的方法。
我知道编程模式和OOP概念,例如多态,当我们需要根据哪个子类执行它来参数化方法时,它们是可用的,但我如何根据哪个对进行参数化课程称之为?
答案 0 :(得分:1)
一个常见的解决方案是:
abstract class Figure {
public abstract boolean collision(Figure that);
public abstract boolean collisionCircle(Circle that);
// similar methods for other subclasses
}
class Circle extends Figure {
public boolean collision(Figure that) {
return that.collisionCircle(this);
}
public boolean collisionCircle(Circle that) { ... }
// etc
}
这里的问题是1)添加子类还需要向Figure
添加方法并修改其他类; 2)不强制对称。
更一般地说,搜索"多次发送"和"访客模式" (例如https://sourcemaking.com/design_patterns/visitor/java/2)。
答案 1 :(得分:0)
根据您的要求,我建议将实际逻辑移到另一个“服务”类中,例如:
public class CollisionDetector {
public boolean areColliding(Figure first, Figure second)
该方法必须明确检查两个参数的实际类型;做downcasts(我知道,丑陋),然后调用相应的方法,如
private boolean areCirclesColliding(Circle c1, Circle c2)
关键是:没有干净的方法来保持内部你的不同子类。如:在检测圆圈---多边形到CircleFigure;或者进入PolygonalFigure?!
我认为这是你必须“切断”你的“交叉”逻辑并将其集中到一个“服务提供商”的情况之一。