Autor Beitrag
ingram333
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 13.02.10 13:15 
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.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
class Item
    {
        internal string name;
        internal string type;
        // usw.
    }

   class Weapon : Item 
    {
        public int dice; 
        public int modifier; 
        // usw.


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.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
 class Outfit
    {
        Item rightHand;
        Item leftHand;
        //usw.

        public void setLeftHand(Item obj, Hero myHero) 
        {
           // Is it a Weapon?
            if (obj.ToString() == "Weapon")
            {
                obj = (Weapon)obj;

            // Funktioniert so nicht... hab keinen Zugriff auf "waepon" spezifische Variablen


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 user profile iconChristian S.: Code- durch C#-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 13.02.10 13:36 
user profile iconingram333 hat folgendes geschrieben Zum zitierten Posting springen:
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.
ausblenden C#-Quelltext
1:
2:
if (obj is Weapon)
  ...
ingram333 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 13.02.10 13:49 
ah alles klaro, ok mir war nicht bewusst das ein Cast das Objekt nur beim Aufruf verändert.

Danke, klappt wunderbar jetzt.