Laden...

Klasse in den Basistyp zurück-casten

Erstellt von itstata vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.028 Views
I
itstata Themenstarter:in
302 Beiträge seit 2008
vor 14 Jahren
Klasse in den Basistyp zurück-casten

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"

T
574 Beiträge seit 2008
vor 14 Jahren

ich würd mal Console.WriteLine((A)item); probieren.

I
itstata Themenstarter:in
302 Beiträge seit 2008
vor 14 Jahren

da kommt das gleiche ergebnis raus 😃. Ich versteh das momentan nicht

R
43 Beiträge seit 2007
vor 14 Jahren

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.

4.207 Beiträge seit 2003
vor 14 Jahren

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

www.goloroden.de
www.des-eisbaeren-blog.de

I
itstata Themenstarter:in
302 Beiträge seit 2008
vor 14 Jahren

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

49.485 Beiträge seit 2005
vor 14 Jahren

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

I
itstata Themenstarter:in
302 Beiträge seit 2008
vor 14 Jahren

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 😃