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
Christian 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; }else if(a is c){ b mycobj = a as c; } else { } } |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!