Mein Problem in Kürze:C#: Vererben getrennte statische Elemente für abgeleitete Klassen
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)
}
Deshalb möchte ich alle meine abgeleiteten Klasse eine gemeinsam genutzte Daten haben, die für die paricular Klasse geteilt wird, sondern haben eine gemeinsame Signatur definiert in die Basisklasse.
Ich erstelle ein einfaches RTS-Spiel zum Spaß in meiner Freizeit. Es gibt verschiedene Arten von Einheiten (Raumschiffe, Gebäude usw.), die einige grundlegende Eigenschaften haben. Diese Einheiten können von den Spielern aufgerüstet werden (alle Einheiten des gleichen Typs, die zu den gleichen Spieler werden aufgerüstet z. B. Spieler A den Tanks' Aufwertungen bedeutet, dass alle seine Panzer bessere Rüstung haben.)
Hier wie ich versuchte, dies achive:
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;}
//...
}
ich dachte über einen zusätzlichen Schlüssel zu meinem dictonary Hinzufügen (verschachtelten Wörterbuch verwenden): Typ-Strukturen als Schlüssel und den Code wie folgt zu ändern:
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;
//...
}
Aber ich " Ich bin mir nicht sicher, ob das wie erwartet funktioniert.
Die Lösung ist wahrscheinlich einfach, aber ich habe keine Ahnung, wie Sie das jetzt lösen.