Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多类匹配_Java_Oop_Design Patterns - Fatal编程技术网

Java 多类匹配

Java 多类匹配,java,oop,design-patterns,Java,Oop,Design Patterns,我正在做一个2D几何游戏,在这个游戏中我有一个基本抽象类Figure,不同的实现从中继承(例如CircleFigure,PolygonalFigure)。我需要一个Figure中的抽象方法来检查这两个图是否相交,让它的签名为公共抽象布尔冲突(Figure that) 问题是每一对图形都需要不同的方法实现;i、 对于两个圆,我要检查两个半径之和是否小于圆心之间的距离。但对于圆和多边形,我会使用完全不同的方法 我知道编程模式和OOP概念,比如多态性,当我们需要根据执行它的子类参数化一个方法时,它们是

我正在做一个2D几何游戏,在这个游戏中我有一个基本抽象类
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) 对称是不强制的

更一般地说,搜索“多分派”和“访客模式”(例如)