Klasse eines Objektes ändern



  • Hallo!

    Die Klasse B wird von Klasse A abgeleitet. Ich möchte jetzt eine Instanz der Klasse A in eine Instanz der Klasse B umwandeln. Gibt es dafür eine bessere möglichkeit als eine neue Instanz der Klasse B zu erstellen und die Werte zu kopieren?



  • nein ... A ist nicht B - aber B ist A



  • Ein normales Auto ist auch kein Polizeiauto. Trotzdem kann man ein normales Auto zu einem Polizeiauto umbauen ohne ein neues Auto bauen zu müssen. Dein Argument überzeugt mich nicht.



  • Mit welcher Frameworkversion arbeitest du? Kovarianz wird erst ab 4.0 angeboten, davor ist es nicht machbar.



  • Firefighter schrieb:

    Mit welcher Frameworkversion arbeitest du? Kovarianz wird erst ab 4.0 angeboten, davor ist es nicht machbar.

    Was hat das mit Kovarianz zu tun?



  • Ah hab ich das vertauscht oder Falsch verstanden?
    Wenn er von B die abgeleitete Klasse von A ist und er B in ein A casten will, ist es doch Kontravarianz oder irre ich mich da grad? Klär mich auf hustbaer



  • Haha hab das gerade mit den Rückgabewerten bei Funktionen durcheiander gebracht. Dann ist mein Post natürlich Unsinn, sorry.



  • Hunz schrieb:

    Ein normales Auto ist auch kein Polizeiauto.

    richtig ... aber ein Polizeiauto ist ein Auto ... A ist nicht P - aber P ist A

    Trotzdem kann man ein normales Auto zu einem Polizeiauto umbauen ohne ein neues Auto bauen zu müssen.

    klar ... Du kannst auch über Reflection Deinen Code zur Laufzeit umbauen

    Dein Argument überzeugt mich nicht.

    das ist kein Argument - das ist einen OOP Tatsache



  • Hat diese Tatsache irgendeinen zusammenhang mit meiner Frage?
    Nehmen wir mal den umgekehrten Falls. Angenommen ich will eine Instanz einer abgeleiteten Klasse in eine Instanz der Basisklasse umwandeln. Geht das denn? Ehrlichgesagt stell ich mir das noch viel schwieriger vor. Ich kann die Instanz der abgeleiteten Klasse natürlich so wie eine der Basisklasse bahandeln, aber sie würde dann trotzdem noch eine Instanz der abgeleiteten Klasse bleiben.



  • Hunz schrieb:

    Hat diese Tatsache irgendeinen zusammenhang mit meiner Frage?
    Nehmen wir mal den umgekehrten Falls. Angenommen ich will eine Instanz einer abgeleiteten Klasse in eine Instanz der Basisklasse umwandeln. Geht das denn? Ehrlichgesagt stell ich mir das noch viel schwieriger vor. Ich kann die Instanz der abgeleiteten Klasse natürlich so wie eine der Basisklasse bahandeln, aber sie würde dann trotzdem noch eine Instanz der abgeleiteten Klasse bleiben.

    Ein Objekt wird mit einem bestimmten Typ (Klasse) erzeugt, und behält diesen dann bis zu seinem Lebensende bei. .NET unterstützt keine "Mutation" bestehender Objekte. Weder in die eine noch in die andere Richtung.
    In manchen anderen Sprachen geht es soweit ich weiss. Dafür gibt es dort auch kein brauchbares statisches Typensystem.

    Also. Antwort: es geht nicht. Nach dem "Warum" solltest du diejenigen fragen, die .NET definiert haben. Vor allem wenn du auf Argumente/Erklärungsversuche mit "ist kein Argument für mich" antwortest.

    Mein Tip: leg dich nicht mit der Realität an, denn du wirst verlieren. Es geht nicht, also finde dich damit ab.



  • Ach, ist doch ganz einfach:

    Auto x = new Auto();
    
    // Und jetzt kommt's:
    x = new Polizeiauto(); // Tadaa!
    

    Ich bin ein Genie. 🕶



  • Kinz schrieb:

    Ach, ist doch ganz einfach:

    Auto x = new Auto();
    
    // Und jetzt kommt's:
    x = new Polizeiauto(); // Tadaa!
    

    Ich bin ein Genie. 🕶

    Nein. Es geht um

    Auto^ x=gcnew Auto("BMW",125*PS);
    Auto^ y=x;
    x->promote(Polizeiauto,/*Kennzeichen=*/"WI-4456");
    y->print();//Ich bin ein Polizeiauto von BMW mit 125PS mit dem Kennzeichen WI-4456
    x->print();//Ich bin ein Polizeiauto von BMW mit 125PS mit dem Kennzeichen WI-4456
    

    Also man stopft des Auto in eine Liste, die große alleAutosListe, und kann es in tiefen Unterfunktionen promovieren lassen, ohne den dummen Weg gehen zu müssen, das Auto aus der Liste löschen zu müssen und es durch ein neues Auto ersetzten zu müssen. Würde eh nicht klappen, weil die

    class Fahrer{
       Auto^ auto;
       ...
    };
    

    gar nicht automatisch mitkriegen könnten, daß das Auto gewechsekt wurde. Man will ohne Autowechsel den Typ des Autos ändern.
    Und das geht halt nicht. Weder C++/CLI noch relationale Datenbanken unterstützen Beförderungen in einer höchst angenehmen Weise.



  • Hunz schrieb:

    Hat diese Tatsache irgendeinen zusammenhang mit meiner Frage?

    ja ... Du hast eine OOP-Frage - und das ist dazugehörige OOP-Regel als Antwort

    Nehmen wir mal den umgekehrten Falls. Angenommen ich will eine Instanz einer abgeleiteten Klasse in eine Instanz der Basisklasse umwandeln. Geht das denn?

    jain - denn B ist A ... Mutation - das da wirklich A rauskommt - geht nicht

    Ich kann die Instanz der abgeleiteten Klasse natürlich so wie eine der Basisklasse bahandeln, aber sie würde dann trotzdem noch eine Instanz der abgeleiteten Klasse bleiben.

    richtig ... es ist und bleibt B

    setz Dich bitte mit OOP Allgemein auseinander



  • Es ist eben keine OOP-Frage sondern eine sehr spezielle C#/.NET Frage. Wenn du dann mit so allgemeinem Zeugs kommst das jeder weiss, muss ich halt davon ausgehen, dass du meine Frage nicht verstanden hast.



  • mogel hat ein außergewöhnliches Verständnis von OOP. OOP ginge viel schöner mit solchen Typänderungen. Weil im Außenleben genau solche Sachen passieren. Der Mitarbeiter wird befördert und schwupps, haben wir ein Problem. Wir müssen ihn rauswerfen und als Vorgesetzten neu einstellen. Helau.



  • <Kleinkariert>

    volkard schrieb:

    Wir müssen ihn rauswerfen und als Vorgesetzten neu einstellen.

    das gibt einen neuen Arbeitsvertrag und das ist eine Änderungskündigung (AFAIK)
    </Kleinkariert>


Log in to reply