2017-04-10 135 views
2

我正在研究2D几何游戏,其中我有一个基本抽象类Figure,其中不同的实现继承了它(例如CircleFigure,PolygonalFigure)。我需要一个抽象方法Figure来检查这两个数字是否相交,让它的签名为public abstract boolean collision(Figure that)多个类匹配

问题是每一对类型的数字都需要这种方法的不同实现;即对于两个圆圈,我会检查两个半径的总和小于圆心的距离。但是对于一个圆和一个多边形,我会用一种完全不同的方法。

我所知道的编程模式和OOP概念,如多态性这是appliable当我们需要参数化的方法,根据该子类执行它,但我怎么能根据这些参数化的类叫它?

回答

0

考虑你的要求,我会建议实际的逻辑移动到另一个“服务”类,如:

public class CollisionDetector { 
    public boolean areColliding(Figure first, Figure second) 

这种方法必须明确检查的实际类型两个参数的;做向下转换(我知道的,丑陋的),然后调用像

private boolean areCirclesColliding(Circle c1, Circle c2) 

相应的方法的问题是:有没有干净的方式,以保持该检测你的不同的子类。如在:应检测​​为圆---多边形为CircleFigure;或成多边形图?

我认为这是您必须“切断”您的“交叉切割”逻辑并将其集中到一个“服务提供商”中的情况之一。

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)。