2017-04-10 101 views
2

我正在研究2D幾何遊戲,其中我有一個基本抽象類Figure,其中不同的實現繼承了它(例如CircleFigure,PolygonalFigure)。我需要一個抽象方法Figure來檢查這兩個數字是否相交,讓它的簽名爲public abstract boolean collision(Figure that)多個類匹配

問題是每一對類型的數字都需要這種方法的不同實現;即對於兩個圓圈,我會檢查兩個半徑的總和小於圓心的距離。但是對於一個圓和一個多邊形,我會用一種完全不同的方法。

我所知道的編程模式和OOP概念,如多態性這是appliable當我們需要參數化的方法,根據該子類執行它,但我怎麼能根據這些參數化的類叫它?

回答

0

考慮你的要求,我會建議實際的邏輯移動到另一個「服務」類,如:

public class CollisionDetector { 
    public boolean areColliding(Figure first, Figure second) 

這種方法必須明確檢查的實際類型兩個參數的;做向下轉換(我知道的,醜陋的),然後調用像

private boolean areCirclesColliding(Circle c1, Circle c2) 

相應的方法的問題是:有沒有乾淨的方式,以保持該檢測你的不同的子類。如在:應檢測​​爲圓---多邊形爲CircleFigure;或成多邊形圖?

我認爲這是您必須「切斷」您的「交叉切割」邏輯並將其集中到一個「服務提供商」中的情況之一。

1

一個常見的解決方案是:

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)對稱性不被執行。

更一般地,搜索「多次調度」和「訪問者模式」(例如https://sourcemaking.com/design_patterns/visitor/java/2)。