在Java中使用翻转参数调用方法

时间:2011-09-13 01:51:39

标签: java methods

我有一些Shape的子类:

Rectangle, Circle, etc.

我在每个类中都有这样的方法:

class Rectangle extends Shape{
    public void isIntersecting(Circle circle){ ... }  
}

class Circle extends Shape{
    public void isIntersecting(Rectangle rectangle){ ... }  
}

这些方法显然会重复代码。我的问题是,我该如何避免这样的事情?

2 个答案:

答案 0 :(得分:2)

简单的答案是实现(例如)Circle的交集方法:

public void isIntersecting(Rectangle rectangle) {
    rectangle.isIntersecting(this);
}

我想不出更优雅的方法。


将API方法定义为:

public void isIntersecting(Shape) { ... }

您最终必须使用每个不同形状的案例编写“instanceof”开关。重复的代码仍然存在,你已经用可能更脆弱的东西替换了静态类型......

(AFAIK,如果两个任意形状相交,则没有通用/有效的测试算法。特别是如果形状涉及曲线。)

答案 1 :(得分:1)

你可以实现它们一次(在任一类中或在某个地方作为静态方法)并让所有方法调用该共享代码。

class Rectangle extends Shape{
   public boolean isIntersecting(Circle circle){ 
      return Shapes.isIntersecting(this, circle);
   }  
} 

class Circle extends Shape{
   public boolean isIntersecting(Rectangle rectangle){
       return Shapes.isIntersecting(rectangle, this);
   }  
}

class Shapes{
    static boolean isIntersecting(Rectangle rectangle, Circle circle){
       // implementation goes here
    }
}