Xmas
2006-05-16, 15:05:56
Ich habe einige Klassen A0, A1, ..., An, die jeweils voneinander Erben und etwa folgendermaßen aussehen sollen:
public abstract class A0
{
protected static Object StaticGet(String key) { return null; }
public virtual Object Get(String key);
}
public class A<n>: A<n-1>
{
protected static Object StaticGet(String key)
{
if(classDict.ContainsKey(key))
return classDict[key];
else
return base.StaticGet(key);
}
public override Object Get(String key)
{
if(instanceDict.ContainsKey(key))
return instanceDict[key];
else
return StaticGet(key);
}
protected Dictionary<String, Object> instanceDict;
protected static Dictionary<String, Object> classDict;
}
Der Code dient nur zur Illustration und compiliert so natürlich nicht.
Zweck: Ich will Objekte, die per String benannte "Eigenschaften" besitzen. Hat eine Instanz eine bestimmte Eigenschaft nicht, fragt sie bei der Klasse nach, diese wiederum bei ihrer Basisklasse, usw.
Beispiel:
Die Klasse Säugetier hat die Eigenschaft "Beine" = 4.
Die Klasse Mensch hat die Eigenschaft "Beine" = 2.
Die Klassen Hund und Mensch erben von Säugetier.
Eine bestimmte Instanz von Hund hat die Eigenschaft "Beine" = 3. ;(
DreibeinigerHund.Get("Beine") soll 3 zurückliefern. EinAndererHund.Get("Beine") soll 4 zurückliefern, nämlich jene die im statischen Dictionary der Klasse Säugetier gespeichert ist.
Nur, wie realisiere ich sowas in C# ohne dass ich für jede Klasse den oben aufgeführten Code nochmal schreiben muss? Rekursive Generics gehen ja leider nicht, also sowas:
public class A <T> : T {}
"base" geht in static-Methoden nicht, also darf StaticGet nicht static sein (was aber kein Problem sein sollte).
Und ich will auch nicht in jeder neuen Klasse classDict deklarieren, nur offensichtlich ist das nötig weil sonst das classDict der Basisklasse verwendet würde.
Oder wäre es sinnvoll, zu jeder Klasse ein Singleton EigenschaftenContainer zu erzeugen, und jeder Klasse ein statisches Feld "baseEigenschaftenContainer" hinzuzufügen? So dass die Klassen durch Referenzen miteinander verbunden sind, nicht mehr nur durch Vererbung.
public abstract class A0
{
protected static Object StaticGet(String key) { return null; }
public virtual Object Get(String key);
}
public class A<n>: A<n-1>
{
protected static Object StaticGet(String key)
{
if(classDict.ContainsKey(key))
return classDict[key];
else
return base.StaticGet(key);
}
public override Object Get(String key)
{
if(instanceDict.ContainsKey(key))
return instanceDict[key];
else
return StaticGet(key);
}
protected Dictionary<String, Object> instanceDict;
protected static Dictionary<String, Object> classDict;
}
Der Code dient nur zur Illustration und compiliert so natürlich nicht.
Zweck: Ich will Objekte, die per String benannte "Eigenschaften" besitzen. Hat eine Instanz eine bestimmte Eigenschaft nicht, fragt sie bei der Klasse nach, diese wiederum bei ihrer Basisklasse, usw.
Beispiel:
Die Klasse Säugetier hat die Eigenschaft "Beine" = 4.
Die Klasse Mensch hat die Eigenschaft "Beine" = 2.
Die Klassen Hund und Mensch erben von Säugetier.
Eine bestimmte Instanz von Hund hat die Eigenschaft "Beine" = 3. ;(
DreibeinigerHund.Get("Beine") soll 3 zurückliefern. EinAndererHund.Get("Beine") soll 4 zurückliefern, nämlich jene die im statischen Dictionary der Klasse Säugetier gespeichert ist.
Nur, wie realisiere ich sowas in C# ohne dass ich für jede Klasse den oben aufgeführten Code nochmal schreiben muss? Rekursive Generics gehen ja leider nicht, also sowas:
public class A <T> : T {}
"base" geht in static-Methoden nicht, also darf StaticGet nicht static sein (was aber kein Problem sein sollte).
Und ich will auch nicht in jeder neuen Klasse classDict deklarieren, nur offensichtlich ist das nötig weil sonst das classDict der Basisklasse verwendet würde.
Oder wäre es sinnvoll, zu jeder Klasse ein Singleton EigenschaftenContainer zu erzeugen, und jeder Klasse ein statisches Feld "baseEigenschaftenContainer" hinzuzufügen? So dass die Klassen durch Referenzen miteinander verbunden sind, nicht mehr nur durch Vererbung.