Autor Beitrag
SchnitzelDude
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Do 27.01.11 18:45 
Guten Tag ich bin neu hier und habe direkt mal eine verwirrende Frage ;)

Ich poste erstmal etwas Pseudo-Code:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Sa 29.01.11 09:12 
Hallo,
für den Pseudo-Code kannst die Methoden überladen, da der Typ zur Kompilierzeit bekannt ist:

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


und dann...
ausblenden 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.