我的问题简要说明:
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<Player,Upgrade> 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<Type,Upgrade>> upgrades;
public void cacheAttributes(Player forPlayer)
{
Dictionary<Type,Upgrade> 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;
//...
}
但我不确定这是否符合预期。
解决方案可能很简单但我现在不知道如何解决这个问题。
答案 0 :(得分:1)
public class Singleton<T>
{
private static string _value;
public string Value
{
get
{
return _value;
}
set
{
_value = value;
}
}
}
public class At<T>
{
public static Singleton<T> field = new Singleton<T>();
}
public class Bt : At<Bt>
{
}
public class Ct : At<Ct>
{
}
...
Bt.field.Value = "bt";
Ct.field.Value = "ct";
答案 1 :(得分:0)
如果通过字典词典你的意思大致类似于Dictionary<Player, Dictionary<Type, Upgrade>>
,那么,是的,这将按预期工作,并且是如上所述的问题的良好解决方案。你也可以使用一组字典,如果你有少量的最大玩家,你真的没有得到任何过于有用的散列4值。 (如果你最多有4名球员)
答案 2 :(得分:0)
一个相当古老的问题,但是,为了让未来的人们受益,这就是我解决类似问题的方法。
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()
。