Java 多类匹配
我正在做一个2D几何游戏,在这个游戏中我有一个基本抽象类Java 多类匹配,java,oop,design-patterns,Java,Oop,Design Patterns,我正在做一个2D几何游戏,在这个游戏中我有一个基本抽象类Figure,不同的实现从中继承(例如CircleFigure,PolygonalFigure)。我需要一个Figure中的抽象方法来检查这两个图是否相交,让它的签名为公共抽象布尔冲突(Figure that) 问题是每一对图形都需要不同的方法实现;i、 对于两个圆,我要检查两个半径之和是否小于圆心之间的距离。但对于圆和多边形,我会使用完全不同的方法 我知道编程模式和OOP概念,比如多态性,当我们需要根据执行它的子类参数化一个方法时,它们是
Figure
,不同的实现从中继承(例如CircleFigure
,PolygonalFigure
)。我需要一个Figure
中的抽象方法来检查这两个图是否相交,让它的签名为公共抽象布尔冲突(Figure that)
问题是每一对图形都需要不同的方法实现;i、 对于两个圆,我要检查两个半径之和是否小于圆心之间的距离。但对于圆和多边形,我会使用完全不同的方法
我知道编程模式和OOP概念,比如多态性,当我们需要根据执行它的子类参数化一个方法时,它们是适用的,但是我如何根据调用它的类对参数化呢?鉴于您的需求,我建议将实际逻辑移到另一个“服务”类中,比如:
public class CollisionDetector {
public boolean areColliding(Figure first, Figure second)
该方法必须显式检查两个参数的实际类型;执行downcast(我知道,丑陋),然后调用相应的方法,如
private boolean areCirclesColliding(Circle c1, Circle c2)
关键是:没有干净的方法将检测保存在不同的子类中。如:应检测为圆形---多边形成圆形图形;还是变成多边形图形
我认为这是一种情况,您必须“切断”您的“交叉”逻辑,并将其集中到单个“服务提供商”中 常见的解决方案是:
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) 对称是不强制的
更一般地说,搜索“多分派”和“访客模式”(例如)