2014-03-02 27 views
1

標題可能有點不具說明性,但我會嘗試在此處儘可能清楚地解釋情況。我創建了一個將由其他人創建的類繼承的類。我的類包含使用我創建了IShape接口的形狀結構體變量,就像這樣:使用接口作爲字段類型,但具有基類選擇派生結構

IShape Bounds = new Rectangle(/*arguments go here*/); 

我怎樣才能讓最終用戶有過,同時仍允許他訪問的方法和字段使用什麼形狀控制選擇形狀(無需拆箱24/7)?基本上我希望用戶選擇他想要的形狀,但仍然具有IShape形式的形狀來執行像碰撞一樣的東西。例如:

Bounds = new Triangle(/*arguments*/); 
Bounds.Point3 = new Point(20f, 20f); //this property would be from the Triangle : IShape struct only and is not inherited from IShape 

有沒有一種方法或解決方法可以讓最終用戶輕鬆使用?

+2

您可以嘗試使用泛型。 – MarcinJuraszek

回答

1

一種可能的解決方案是使用具有接口約束的泛型類。因此,聲明看起來是這樣的:

public class MyClass<TShape> where TShape : IShape 
{ 
    protected TShape Bounds; 
    //Rest of class 
} 

或者,您可以提供通過一個通用的方法訪問,其形狀會集中,其中,鑄完成:

public class MyClass 
{ 
    private IShape Bounds; 

    protected TShape GetBounds<TShape>() where TShape : IShape 
    { 
     return (TShape)Bounds; //Note this will throw an exception if the wrong shape is specified 
    } 
    //Rest of class 
} 

前者是如果更合適基類應該負責瞭解自己的形狀類型。如果基類應該不知道它的形狀類型,而繼承類(或者如果你公開事物時調用類)應該知道的話,後者更合適。

但是,儘管其中一種解決方案可能適合您的情況,但完全可以做到這一點有點代碼味道。如果你的類在大多數情況下需要知道和跟蹤具體的具體類,那麼使用接口沒有多大意義。最好的解決方案可能是改變你的設計,儘管如果沒有看到更多的東西,很難給出建議。

+0

感謝您的反饋。如果我必須選擇,我會選擇第二個選項。我來到這個設計是因爲我實現了一個可以採用任何形狀的碰撞系統(因此IShape接口)。 https://github.com/Villermen/HatlessEngine/blob/master/PhysicalObject.cs是對象的位置,BoundBox仍然是一個矩形。我想將其改爲IShape或類似的系統。你會有什麼不同的建議嗎,因爲你認爲它是borky的代碼? – Villermen

+0

@Villermen好吧,我不確定爲什麼你有這個要求,可以隨時按照確切的類型獲得形狀。你是否考慮並拒絕了所有這些可能性: - 使邊界形狀不可變 - 只允許用新的替換邊界形狀而不是修改現有的邊界形狀 - 無論外部代碼如何設置第一個形狀只要它需要它的確切類型的參考 - 根本沒有形狀子類型,有Shape取任意長度的點列表(> 2) –

+0

想到用戶實際上會用它做什麼I去了你的第一個選擇。用戶可以設置一個綁定的形狀,然後他唯一不能訪問的東西可能是旋轉,但我甚至可以爲此做一個解決方法。所以用戶需要做的就是給它分配一個新的形狀。如果他想改變例如該形狀的寬度或旋轉,如果它是一個矩形,他只需將其投射出去。感謝您的幫助Ben! – Villermen

相關問題