2016-09-05 103 views
0

圖片我們有一個類RotationClass,它旋轉地理對象(三角形,圓形,線)。驗證對象是否可以被處理的最佳實踐

在類,我們有3種方法:

RotateTriangle() 
RotateCircle() 
RotateLine() 

....

所以有人給GeoObjects的名單上我的課,他們都得到與他們的specifit旋轉,旋轉的方法。

但現在...有一個新的GeoObject矩形.....我如何實現一個像「CanRotateGeoObjectList」的Methode?該方法應檢查每個GeoObject是否存在Rotate-Method。

希望你能理解

[編輯:附加信息] 我不能改變/具有對GeoObject進不去 - 代碼

+0

請更新您的問題,添加難以置信的重要信息,您無法更改GeoObject實施的源代碼。否則,您的問題的每個答案都會建議您更改這些實現。 –

回答

1

你這樣做,通過使用適當的面向對象的設計思想;還有的第一件事:你應該永遠進入創造一個像doSomethingForClassA(),doSomethingForClassB()方法的業務,...

一個天真的方式可能是使你的GeoObject類抽象的;並添加一個抽象方法rotate();和布爾型返回supportsRotation()

你的子類將不得不以正確的方式實現這兩個方法。該解決方案的警告:取決於你的「建模」GeoObject可能應該而不是瞭解「旋轉」 - 有一個特殊的旋轉類的想法有一定的優點;特別是在考慮可能會有許多其他轉換適用於GeoObject時。

解決此類情況的一種方法是visitor pattern

編輯:給你的評論我想知道你是否可以圍繞GeoObject創建自己的包裝。也許甚至有一些簡單的東西,比如

public class GeoObjectWrapper { 
    private final GeoObject wrappedObject; 
    public GeoObjectWrapper(GeoObject wrappedObject) { 
    this.wrappedObject = wrappedObject); 
    } 

public Object getWrapped() { return wrappedObject; } 

然後把你需要的新方法包裝到你的包裝類中。

但是,爲了提出一個解決方案,它不會執行諸如rotateTriangle()之類的醜陋事情......您可能需要編程語言中的反射機制。

+0

有沒有GeoObject實現一個旋轉界面是一個可行的選擇? – c0der

+0

好的,那將是我的解決方案......但我沒有訪問GeoObjects!這是一個非常大的計劃,我必須添加這個模塊....是的,我們知道這不是一個「好」的解決方案,但我不能訪問對象。所以最後知道我的班的作品,但問題依然存在--->如果有一個列表與對象我不知道我不會認識到這一點。 – AnonymGuest

0

如果您不能更改GeoObject的實現,則可以使用反射來獲取實例上的方法。這不是乾淨的解決方案,但它可以解決它,如果你的編程語言支持反射。