Hallo zusammen,
ich komm irgendwie gar nicht klar... Ich möchte einfach nur meine klasse in den Basistyp zurück-casten. Leider funktioniert das nicht so wie ich mir das denke.
class A
{
public override string ToString()
{
return "Ich bin A";
}
}
class B : A
{
public override string ToString()
{
return "Ich bin B";
}
}
class Program
{
static void Main(string[] args)
{
List<B> liste = new List<B>();
for (int i = 0; i < 10; i++)
{
liste.Add(new B());
}
A[] aListe = (A[])liste.ToArray();
foreach (var item in aListe)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
das ergibt:
Ich bin B
Ich bin B
Ich bin B
Ich bin B
Ich bin B
Ich bin B
Ich bin B
Ich bin B
Ich bin B
Ich bin B
Warum denn das? Ich caste doch explizit zu "A"
ich würd mal Console.WriteLine((A)item); probieren.
du schreibst immer "new B()", deshalb ist die Instanz ein B. Die ToString()-Methode von A wird somit durch jene B überschrieben. Du müsstest "new A()" schreiben, damit du bei deim Code zum gewünschten Ergebnis kommst.
Das ist der Unterschied zwischen new und override, siehe auch http://www.guidetocsharp.de/Faq.aspx, Abschnitt "Was ist der Unterschied zwischen new und override?"
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
das klappt...danke,
ich hab aber noch eine andere Frage. Die GetType- Methode liefert mir noch den Typ B. Kann ich die Klasse von B nach A auch ganz explicit casten. Mein Webservice meckert sonst immer wenn ich ihm ein Typ sende der nicht "A" ist.
class A
{
public override string ToString()
{
return "Ich bin A";
}
}
class B : A
{
public new string ToString()
{
return "Ich bin B";
}
}
class Program
{
static void Main(string[] args)
{
List<B> liste = new List<B>();
for (int i = 0; i < 10; i++)
{
liste.Add(new B());
}
A[] aListe = (A[])liste.ToArray();
foreach (var item in aListe)
{
A a = (A)item;
Console.WriteLine(a.GetType());
}
Console.ReadKey();
}
Ausgabe: ConsoleApplication2.B
Hallo itstata,
das klappt...danke,
das ist aber sicher nicht, was du willst. Es sollte immer der tatsächliche Typ des Objekts (dynamischer Typ) entscheiden, welche Methode aufgerufen wird. Es sollte nicht im Ermessen des Aufrufers liegen, das entscheiden zu können. Es sollte also nie auf den Typ der Variablen ankommen, die das Objekt gerade referenziert (statischer Typ). Insofern ist new
so gut wie immer der falsche Weg. Du solltest immer override
benutzen.
Davon abgesehen ist es ohnehin überflüssig in den Basistyp zu casten, weil jedes Objekt automatisch typkompatibel zu seinem Basistyp ist. Eine Anweisung A a = new B ()
ist also ohne Cast möglich.
Kann ich die Klasse von B nach A auch ganz explicit casten.
Das geht eben nur, wenn man ein neues Objekt vom Typ A erstellt und darin die Daten des Objekts b übernimmt, die auch in A vorkommen. Man muss sich klar machen, dass die beiden Objekte a und b, die man anschließend hat, zwei vollkommen unabhängige Objekte sind, die nichts weiter gemeinsam haben, als "zufällig" den gleichen (Anfangs-)Zustand.
herbivore
in Ordnung, da mein Webservice nur Klasse A versteht werde ich also eine neue Instanz anlegen und die Werte die ich brauche reinschieben. Die Methoden werde ich dann weiterhin mit override implementieren. Da ist das System zu schlau 😃