ingram333 - Sa 13.02.10 13:15
Titel: Zugriff auf vererbte Objekte bei zuweisung an Basisklasse
Hallo Community!
habe ein kleines Verstädnisproblem, wie ich folgenden Sachverhalt am besten lösen kann.
Ich habe eine Klasse "Item", von der z.B. die Klasse "Weapon" erbt.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| class Item { internal string name; internal string type; }
class Weapon : Item { public int dice; public int modifier; |
Ich habe nun eine weitere Klasse die Objekte des Types "Item", die sowohl Basisobjekte (Item) als
auch die vererbten wie z.B. Weapon, Shield,... halten soll.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| class Outfit { Item rightHand; Item leftHand; public void setLeftHand(Item obj, Hero myHero) { if (obj.ToString() == "Weapon") { obj = (Weapon)obj;
|
Mein Problem nun:
a) Ich möchte erkennen welche Klasse nun an die Methode übergeben wird (also Item oder eine vererbte).
Ich denke das geht elleganter als mit "if (obj.ToString() == "Weapon")" oder?
b) Ich möchte je nachdem welche Klasse übergeben wird, anders darauf reagieren und vor allem
möchte ich (was derzeit nicht klappt) auch Zugriff auf die spezifischen Variablen der vererbten
Klasse haben (also wenn es eine Weapon ist, dann möchte ich über "obj.dice" auf die Variablen zugreifen
können.
Hab versucht das Objekt zu casten "(Weapon)obj", aber das scheint nicht den gewünschten erfolg zu bringen.
Wie löst man diesen Sachverhalt sauber?
Danke fürs lesen!
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
jaenicke - Sa 13.02.10 13:36
ingram333 hat folgendes geschrieben : |
Hab versucht das Objekt zu casten "(Weapon)obj", aber das scheint nicht den gewünschten erfolg zu bringen. |
Nein, weil du es nur wieder in eine allgemeine Variable vom Typ Item legst. Und bei der Variable kannst du dann natürlich weiter nur auf die Daten von einem Item zugreifen.
Mit dem Cast wandelst du ja nichts um, sondern sagst nur, dass
an dieser Stelle das Objekt wie ein Objekt vom Typ Weapon benutzt werden soll. Das gilt aber auch nur in dieser Zeile bei der Zuweisung. Wenn du danach obj benutzt, greifst du wieder als Item darauf zu...
Deshalb brauchst du eine Variable vom Typ Weapon oder musst bei
jedem Zugriff casten.
Prüfen kannst du mit is.
C#-Quelltext
1: 2:
| if (obj is Weapon) ... |