多类匹配

时间:2017-04-10 12:07:56

标签: java oop design-patterns

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

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

我知道编程模式和OOP概念,例如多态,当我们需要根据哪个子类执行它来参数化方法时,它们是可用的,但我如何根据哪个进行参数化课程称之为?

2 个答案:

答案 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?!

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