Entwickler-Ecke

Basistechnologien - Casten um drei Ecken


SchnitzelDude - Do 27.01.11 18:45
Titel: Casten um drei Ecken
Guten Tag ich bin neu hier und habe direkt mal eine verwirrende Frage ;)

Ich poste erstmal etwas Pseudo-Code:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
class a
{
}

class b : a
{
}

class c : a
{
}

void abc(a var)
{
    (?)var;
}

void main()
{
    b obj = new b();
    abc(obj);
}


meine Frage ist jetzt:
wie kann ich in der Funktion abc() das object so casten, sodass wenn ich a übergebe ich nach a caste und wenn ich b übergebe ich nach b caste.
D.h. dass es möglichst variabel ist ob ich a oder b übergebe.

Moderiert von user profile iconChristian S.: Highlight- durch C#-Tags ersetzt


Th69 - Do 27.01.11 19:06

Hallo,

zuersteinmal: Bitte poste deinen Code in [ cs ] ... [ /cs ] - Tags (so kriegt man ja Augenkrebs!)

Warum willst du denn überhaupt casten? Mittels Vererbung und Polymorphie solltest du gerade das vermeiden (d.h. benutze virtuelle Methoden).


IsNull - Fr 28.01.11 18:56

Hi!

Zitat:
Warum willst du denn überhaupt casten?

Naja teilweise ist das schon nötig, wenn das Interface der base nicht explizit genug ist. Sollte dennoch nicht die Gewohnheit werden, da geb ich dir recht.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
void Test(a obj){

  if(a is b){
    b mybobj = a as b;
    // weitere logik
  }else if(a is c){
    b mycobj = a as c;
    // weitere logik
  } else {
   // a ist ein a
  }
}


danielf - Sa 29.01.11 09:12

Hallo,
für den Pseudo-Code kannst die Methoden überladen, da der Typ zur Kompilierzeit bekannt ist:


C#-Quelltext
1:
2:
3:
    class A { }
    class B : A { }
    class C : A { }


und dann...

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
        static void Method(A baseClass)
        {
            Console.WriteLine("Class A");
        }

        static void Method(B bClass)
        {
            Console.WriteLine("Class B");
        }

        static void Method(C cClass)
        {
            Console.WriteLine("Class C");
        }


Wenn du was dynamisches hast (was mehr Sinn macht) gibt es die Möglichkeit ein Visitor-Pattern zu implementieren. Dabei wird der Typ aufgelöst und die entsprechende Methode aufgerufen. Kommt halt drauf an, ob/wieviel du an den Klassen verändern kannst. Wenn du vollen Zugriff hast dann solltest du das Interface erweitern bzw. eines einführen.

Gruß

Edit/PS: Alternativ gibt es natürlich noch weitere unschöne Möglichkeit wie Reflection bzw. dynamic.