C#:为派生类inheritance单独的静态成员

我的问题简要说明:

class A { /* Other stuff in my class*/ protected static staticMember; } class B : A { /* Other stuff in my class*/ // Will have A.staticMember but I want B.staticMember (same type) } class C : A { /* Other stuff in my class*/ // Will have A.staticMember but I want C.staticMember (same type) } 

所以我希望我的所有派生类都有一个为该特定类共享的共享数据,但在基类中定义了一个共同的签名。

我在空闲时间创造了一个简单的RTS游戏。 有几种单位(宇宙飞船,建筑物等)具有一些基本属性。 这些单位可以由玩家升级(属于同一玩家的所有相同类型的单位都升级,例如。玩家A升级坦克的装甲意味着他的所有坦克将拥有更好的装甲。)

以下是我尝试实现此目的的方法:

 abstract class Unit { /*several methods that is common for all units*/ /*We don't know the unit's attributes at this point*/ protected abstract double getMaxHitpoints(); protected abstract double getFusionArmor(); protected abstract double getNormalArmor(); // and more similar abstract methods to come. double maxHitpoints; double fusionArmor; double normalArmor; //... // This method is called on construction and after upgrade completion. public void cacheAttributes(Player forPlayer) { Upgrade upgradesForThisUnit; //<<< Upgrade is class that is used like a struct to hold the upgrades for this kind of unit. upgrades.TryGetValue(forPlayer,out upgradesForThisUnit); ///< get upgrades if available (if not available it will give the default value [=no bonuses]) maxHitpoints=getMaxHitpoints()+upgradesForThisUnit.hitpointBonus; fusionArmor=getFusionArmor()+upgradesForThisUnit.fusionArmorBonus; normalArmor=getNormalArmor()+upgradesForThisUnit.normalArmorBonus; //... } // This data structure is intended to hold the upgrades for every player for this kind of the unit // but unfortunally derived classes have this instance too so if the player upgrades the tanks it will upgrade the interceptors, peasants, buildings too... protected static Dictionary upgrades; } class Tank : Unit { protected override double getMaxHitpoints() {return 1000;} protected override double getFusionArmor() {return 10;} protected override double getNormalArmor() {return 50;} //... } 

我想为我的dictonary添加一个额外的键(使用嵌套字典):键入结构作为键并修改代码,如下所示:

 protected static Dictionary<Player,Dictionary> upgrades; public void cacheAttributes(Player forPlayer) { Dictionary upgradesForThePlayer; upgrades.TryGetValue(forPlayer,out upgradesForThePlayer); Upgrade upgradesForThisUnit; //<<< Upgrade is class that is used like a struct to hold the upgrades for this kind of unit. upgradesForThePlayer.TryGetValue(GetType(),out upgradesForThisUnit); ///< get upgrades if available (if not available it will give the default value [=no bonuses]) maxHitpoints=getMaxHitpoints()+upgradesForThisUnit.hitpointBonus; fusionArmor=getFusionArmor()+upgradesForThisUnit.fusionArmorBonus; normalArmor=getNormalArmor()+upgradesForThisUnit.normalArmorBonus; //... } 

但我不确定这是否符合预期。

解决方案可能很简单,但我现在不知道如何解决这个问题。

如果通过字典词典你的意思大致像Dictionary>那么,是的,这将按预期工作,并且是如上所述的问题的良好解决方案。 如果你拥有少量的最大玩家,你也可以使用一组词典,你并没有真正得到任何过于有用的哈希值4。 (如果你有最多4名球员)

  public class Singleton { private static string _value; public string Value { get { return _value; } set { _value = value; } } } public class At { public static Singleton field = new Singleton(); } public class Bt : At { } public class Ct : At { } ... Bt.field.Value = "bt"; Ct.field.Value = "ct"; 

一个相当古老的问题,但是,为了使未来的人们受益,这就是我如何解决类似的问题。

 class A { /* Other stuff in my class*/ protected MyClass nonStaticMember; } class B : A { private static B _instance; public static B instance { get { return _instance; } } static B() { _instance = new B(); } /* Other stuff in my class*/ // Will have B.instance.nonStaticMember } class C : A { private static C _instance; public static C instance { get { return _instance; } } static C() { _instance = new C(); } /* Other stuff in my class*/ // Will have C.instance.nonStaticMember } 

这假设您可能希望从另一个类访问C.instance.doSomethingTo_nonStaticMember()