我有一些Shape的子类:
Rectangle, Circle, etc.
我在每个类中都有这样的方法:
class Rectangle extends Shape{
public void isIntersecting(Circle circle){ ... }
}
class Circle extends Shape{
public void isIntersecting(Rectangle rectangle){ ... }
}
这些方法显然会重复代码。我的问题是,我该如何避免这样的事情?
答案 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
}
}