2014-09-05 175 views
4

我傾向於非常依賴泛型,但我擔心我濫用它們。我濫用C#泛型嗎?

例如,我有一個Entity,其中包含Component的子類字典,組件的類型是鍵,組件是值。實施例將是一個PositionComponentColorComponent

我有用於分離和獲取部件的方法,定義爲這樣:

class Entity 
{ 
    Dictionary<Type, Component> components; 

    //... 

    void DetachComponent<T>() 
     where T : Component 
    { 
     components.Remove(typeof(T)); 
    } 

    T GetComponent<T>() 
     where T : Component 
    { 
     return (T)components[typeof(T)]; 
    } 
} 

我用被簡單地使功能辯論替代使用參數:void DetachComponent(Type componentType) ,但我不喜歡調用每種方法,如:entity.DetachComponent(typeof(ColorComponent));

這是濫用泛型?我通常爲容器類執行此操作,因爲使用鍵類型作爲鍵的鍵值對對我來說是有意義的。

+1

這隻會允許每種類型的單個組件,不是 – 2014-09-05 16:26:39

+0

@RowlandShaw不太確定你問的是什麼,我省略了添加組件的代碼,因爲它沒有在方法中使用泛型。 – Shane 2014-09-05 16:27:33

+3

@Shane他只是指出,如果你註冊/取消每個類型的基礎上,那麼你不能有多個相同類型的實例(否則調用detach會隨機刪除一個,因爲你沒有任何關於「其中」你想刪除的類型之一,因爲你只能通過類型)。我很確定這對你沒問題,但我認爲這是他的問題 – 2014-09-05 16:29:04

回答

6

我沒有看到任何問題。

對於DetachComponent,使用泛型簡直是不必要的 - 通過將類型作爲泛型參數傳遞,而不是僅傳遞常規(Type componentType)參數就沒有任何好處。

對於GetComponent,使用泛型允許您在編譯時返回正確的類型,而不需要調用代碼必須將其轉換。在這裏,使用泛型是有道理的。

由於使用泛型

  • 有道理的GetComponent
  • 不會傷害爲DetachComponent

我認爲,一致性的原因是有意義的使用兩個(即完成你所做的事)。

+0

感謝您的回覆。我很好奇,如果你有任何關於更好的方式來存儲這些的想法?整個問題都假設我正在使用帶鍵的字典作爲類型。我已經實現了使用Enum的組件類型,但是這讓我覺得我只是簡單地分割代碼並使其更加複雜。 – Shane 2014-09-05 16:35:46

+0

@Shane:如果你的實體可以有每個組件的0-1個實例,我喜歡你的解決方案。您不需要在枚舉中複製類名,並且您的'T:Component'通用約束方便地確保只有組件將傳遞給'Attach' /'Get' /'Detach'方法。 – Heinzi 2014-09-05 16:44:36

+0

非常感謝! – Shane 2014-09-05 16:45:45