2014-01-08 46 views
0

我無法設計一個遊戲對象倉庫好傢伙:自動化對象庫的遊戲

class ObjectRepository 
{ 

private readonly LevelType _levelType; 

private readonly BaseObject[] _darkForestObjects = new BaseObject[] 
       { new DarkForestTreeA(), new DarkForestTreeB(), new DarkForestTreeC() }; 

private readonly BaseObject[] _lightForestObjects = new BaseObject[] 
       { new LightForestTreeA(), new LightForestTreeB(), new LightForestTreeC() }; 

public ObjectRepository(LevelType lt) 
{ 
    _levelType = lt; 
} 

public BaseObject GetObject(int obj) 
{ 
    if (obj < 0 || obj > _darkForestObjects.Length) 
    { 
     Debug.LogError("Object does not exist."); 
     return null; 
    } 

    switch (_levelType) 
    { 
     case LevelType.DarkForest: 
      return _darkForestObjects[obj]; 
     case LevelType.LightForest: 
      return _lightForestObjects[obj]; 
    } 

    return null; 
} 
} 

public enum LevelType 
{ 
    DarkForest = 0, 
    LightForest = 1, 
} 

我尋找這個自動化自動化class.By它的方式,我的意思是我不要我不想每次創建一個派生自BaseObject的新對象進入Repository類並修改數組。這似乎並不自然。任何人都可以指出我對自動化的建議嗎?

+0

我不確定我是否理解這個問題。您希望由系統自動程序存儲庫,但「自動化倉庫」 _doesn't_自動意味着包括存儲庫的集合在新的'BaseObject'實例?那麼你在試圖自動化什麼? –

+0

我必須承認我和@BrianS有同樣的問題。如果可能的話,我會要求你少用特定的代碼,並描述你實際上想要做什麼。讓我想試試:你想,只要創建一個新的BaseObject派生的對象,將自動添加到您的收藏庫?另外,你認爲數組操作可能有點笨重? – OnoSendai

回答

1

我會在這個問題上有所作爲,所以請讓我知道,如果我錯了。

你需要:

  • 是會抓住你的BaseObject來源的情況下,一個存儲庫;
  • 所述存儲庫必須可由BaseObject類訪問;
  • 無論何時創建BaseObject,它都會將其自身添加到存儲庫。

現在,我注意到,您有兩個版本的對象的實例。所以我還會建議一個給定「對象」的明暗版本的持有者類。就像這樣:

class CompoundObject 
{ 
    public BaseObject LightVersion; 
    public BaseObject DarkVersion; 
} 

你的版本庫,那麼持有CompoundObject衍生對象,而不是BaseObject對象在創建時將他們自己,CompoundObject對象將做到這一點。

現在關於數組操作,你可能是對的;它可能有點笨重。我建議採用List<CompoundObject>而不是CompoundObject[]。一個通用的List提供非常方便的方法,如添加和刪除,可以簡化您的集合操作。

+0

這似乎reasonable.Thank你! –

1

如果我是你,我會選擇使用接口的更通用的解決方案。 考慮你的例子,我假設你有多個級別類型,它們有自己特定的TreeA,TreeB和TreeC實現。 如果我理解正確,我寧願爲每種樹類型使用接口。 TreeA示例:

public interface ITreeA 
{ 
    // any common public members here 
} 

public class DarkForestTreeA : ITreeA, BaseObject 
{ 
    ... 
} 

public class LightForestTreeA : ITreeA, BaseObject 
{ 
    ... 
} 

這樣,您可以要求您的存儲庫提供特定於級別類型的ITreeA實現。喜歡的東西:

public T GetObject<T>() // where T could be ITreeA, ITreeB... 
{ 
    ... 
} 

所以,你可以調用myRepo.GetObject(),並獲得DarkForestTreeA對象,如果級別類型是DarkForest例如。

要使此行爲爲「自動化」,您可以在唯一的名稱空間中聲明DarkForest的所有特定實現,然後使用反射來查找實現ITreeA的名稱空間的類。這在性能方面可能不是非常高效,但它給了您極大的靈活性,因爲您只需在命名空間中添加新類以使其可從存儲庫中獲得它們即可。但是,它也可能帶來其他問題(例如,如果您有兩個類在同一名稱空間中實施ITreeA,會發生什麼情況?)。 有關實施細節,請參見Getting all types in a namespace via reflectionGetting all types that implement an interface with C# 3.0。我不得不承認這不是最簡單的解決方案。

你可以考慮簡單的東西一樣定義對象類型(treeA,treeB)一本字典,然後定義字典每個級別類型映射對象類型的具體實施。 例如:

public enum ObjectType 
{ 
    TreeA, 
    TreeB, 
    TreeC, 
} 

Dictionary<ObjectType, Type> DarkForestObjectTypes = new Dictionary<ObjectType, Type>() 
{ 
    { ObjectType.TreeA, typeof(DarkForestTreeA) }, 
    { ObjectType.TreeB, typeof(DarkForestTreeB) } 
    ... 
} 

我不會去到更多的細節,這個答案看起來有點凌亂,但希望它會給你的想法跟去。

+0

+1 - 接口確實也是一個不錯的方法。 – OnoSendai