で反転したパラメータを持つメソッドを呼び出します。私の質問は、このようなことをどうやって避けるのですか?私は、よりエレガントな方法を考えることはできませんは私がShapeのいくつかのサブクラスを持っているJavaの
public void isIntersecting(Rectangle rectangle) {
rectangle.isIntersecting(this);
}
:
で反転したパラメータを持つメソッドを呼び出します。私の質問は、このようなことをどうやって避けるのですか?私は、よりエレガントな方法を考えることはできませんは私がShapeのいくつかのサブクラスを持っているJavaの
public void isIntersecting(Rectangle rectangle) {
rectangle.isIntersecting(this);
}
:
一度(いずれかのクラスでも静的メソッドでも)それらを実装し、すべてのメソッドでその共有コードを呼び出すことができます。
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
}
}
単純な答えは、と(例えば)サークルの交差点メソッドを実装することです。
このようにAPIメソッドを定義すると問題:
public void isIntersecting(Shape) { ... }
を使用すると、異なる形状のそれぞれに対する場合と「instanceofの」スイッチをコーディングする必要が終わるということです。繰り返しのコードはまだありますが、静的な型付けを潜在的により壊れやすいものに置き換えました...
(AFAIK、任意の2つの図形が交差するかどうかをテストするための一般的な/効率的なアルゴリズムはありません。シェイプには曲線が含まれます)。
+1。 CircleコードをRectangleに入れたくない場合は、すべてのShapeの交差計算を行う静的メソッドを持つヘルパークラスを用意してください。 – Thilo
私はrectangle.isIntersecting(this)を考えましたが、すぐにコードを置くための本当に「正しい」場所がないことを認識しました。 RectangleクラスまたはCircleクラスにする必要がありますか?また、私はAPIメソッドをどのように定義することを提案しますか?あなたは正しいです、今の私はinstanceofスイッチを持っていますが、私はそれがまったく好きではありません。 – you786
メソッド本体が何であるかの良い例を挙げたら、機能をリファクタリングする方法を教えてください。メソッドのシグネチャに関係なく、同じコードですか? –
申し訳ありませんが、私はあなたの質問を理解していません。明らかにcircle.isIntersecting(Triangle tri)はrectangle.isIntersecting(Triangle tri)と同じコードを持つことはありません。それはあなたが意味することですか? – you786