Вызов метода с перевернутыми параметрами в Java - PullRequest
1 голос
/ 13 сентября 2011

У меня есть несколько подклассов Shape:

Rectangle, Circle, etc.

У меня также есть методы в каждом классе:

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

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

Эти методы, очевидно, будут повторять код. У меня вопрос, как мне избежать чего-то подобного?

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011

Простой ответ - реализовать (например) метод пересечения окружности следующим образом:

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

Я не могу придумать более элегантный метод.


Проблема с определением метода API следующим образом:

public void isIntersecting(Shape) { ... }

означает, что вам приходится кодировать переключатель instanceof регистром для каждой из различных форм. Повторяющийся код все еще там, и вы заменили статическую типизацию чем-то потенциально более хрупким ...

(AFAIK, нет общего / эффективного алгоритма для проверки, если две произвольные фигуры пересекаются. Особенно, если фигуры содержат изогнутые линии.)

1 голос
/ 13 сентября 2011

Вы можете реализовать их один раз (в любом классе или где-нибудь как статический метод) и заставить все методы вызывать этот общий код.

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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...