none
Konvertierung in Abgeleitete Klasse RRS feed

  • Frage

  • Hallo, ich habe ein kleines Problem.

    Also: ich habe eine Klasse names "standardclass" in der ich variablen hinterlegt habe, welche ich immer, also in jeder Klasse, benötige.

    Aus dieser Klasse leiten sich 3 Klassen ab, "Players","figures","Coordinates".


    nun habe ich das Problem, das, wenn ich versuche die klasse Players zu in standardclass zu konvertieren, um si danach der der Klasse "figures" zu übergeben, Players nicht wirklich gecastet wird. Sie ist danach immernoch vom Typ {game.Players}, was ich nicht wirklich verstehe, und was natürlich zu einer Invalidcastexeption führt. Kann mich jemand erleuchten?


    Den Cast mache ich folgendermaßen:

    case 1:
    Standardclass b = (Standardclass)ObjectList[edit]; // Objectlist[edit] ist vom Typ "Players"
    Figures playerfigures[edit] = (Figures) b;// InvalidCast
    ...
    ...
    break;

    Mit freundlichen grüßen und vielem Dank im Vorraus :)

    Donnerstag, 20. Dezember 2012 08:26

Antworten

  • Hallo,

    ein Objekt wird durch diese Casts nicht verändert. Wenn wir bei dem Auto Beispiel bleiben, dann ist es halt so, dass oft einfach nur Autos wichtig sind. Auf einem Parkplatz stehen Autos. Oder Du hast eine Liste von Autos. Dabei ist es dann egal, was für ein Auto das genau ist.

    Aber wenn Du ein BMW auf einen Parkplatz stellst, dann mag der BMW in einer List<Auto> drin sein. Jemand, der etwas mit einem Auto machen möchte, kann dann darauf zugreifen und etwas damit machen. Also wenn Auto eine Method "Zerstören" hat, könnte jemand dies mit Deinem BMW machen.

    Aber nur dadurch, dass Dein BMW auf einem Parkplatz steht, auf dem Autos stehen können, bleibt es weiter ein BMW.

    Und wenn Du nun spezifische Dinge brauchst, dann musst Du prüfen. Beispiel Werkstatt. Du bringst ein Auto zur Werkstatt und die schaut dann: Ist es ein BMW? Ist es ein VW? Und wenn sie den richtigen Typ gefunden haben, dann können sie mit den Spezialitäten der Klasse anfangen (Und z.B. das Steuergerät auslesen. Das ist dann von mir aus bei VW und BMW unterschiedlich. Ggf. gibt es auch Autos ganz ohne Steuergerät...

    Hier passt das Beispiel also ganz gut - und zeigt, dass es keine wirkliche Konvertierung in etwas neues ist. Sondern lediglich ein "Ich nehme den BMW als Auto". Mal angenommen, es würde gehen und du machst aus BMW ein Auto - dann würde das BMW Steuergerät verschwinden. Wenn Du jetzt aus Auto ein "VW" machen willst, müsste ja irgendwoher das VW Steuergerät kommen. Dafür gibt es aber keine Quelle.

    Mit den besten Grüßen,

    Konrad

    • Als Antwort markiert Kargohose Donnerstag, 20. Dezember 2012 09:04
    Donnerstag, 20. Dezember 2012 09:02

Alle Antworten

  • Hallo,

    ich habe jetzt verstanden, dass Du die folgenden Klassen hast:
    class standardclass
    class Players : standardclass
    class figures : standardclass
    class Coordinates : standardclass

    Bei einer solchen Konstellation ist ein Objekt vom Typ Players nicht Figures umwandelbar. Das sind zwei paar Schuhe.

    Wird evtl. deutlicher, wenn ich ein Auto-Beispiel bringe:
    class Auto
    class BMW : Auto
    class VW : Auto

    Wenn jemand ein Auto braucht kannst Du ihm ein BMW oder VW geben. Aber wenn ich einen VW will, kannst Du mir keinen BMW geben.

    Ich hoffe, das hat etwas geholfen.

    Mit den besten Grüßen,

    Konrad

    Donnerstag, 20. Dezember 2012 08:39
  • Ja, genauso habe ich es gemeint.

    Das mit den Autos war wirklich verständlicher.

    Ich hab das so gedacht: ich habe einen Bmw und konvetertiere ihn wieder runter in die Grundfunktionen eines Autos(also Motorleisstung, Länge, Fahrgestellnummer etc). Dann konvertiere ich es in einen VW mit eben diesen Merkmalen - soetwas geht also nicht?

    Also ich habs jetzt durch auslagern gelöst, aber es kommt mir halt nicht objektorientiert vor, und ich will möglichst sauberen code mir direkt beibringen, da ich ab nächstem Jahr ne Ausbildung als Anwendungsentwickler anfangen werde.

    Vielen Dank.

    Donnerstag, 20. Dezember 2012 08:50
  • Hi Kargohose,

    das Player eine Figure ist, kann ich ja noch verstehen, aber ich denke das die Figure Coordinaten hat.

    Hier würde dann keine Vererbung vorliegen sondern eine Komposition. Deine Klassen würden also nicht von standartclass Erben sondern ein Attribut standartclass haben. 

    MFG

    Björn

    Donnerstag, 20. Dezember 2012 09:01
  • Hallo,

    ein Objekt wird durch diese Casts nicht verändert. Wenn wir bei dem Auto Beispiel bleiben, dann ist es halt so, dass oft einfach nur Autos wichtig sind. Auf einem Parkplatz stehen Autos. Oder Du hast eine Liste von Autos. Dabei ist es dann egal, was für ein Auto das genau ist.

    Aber wenn Du ein BMW auf einen Parkplatz stellst, dann mag der BMW in einer List<Auto> drin sein. Jemand, der etwas mit einem Auto machen möchte, kann dann darauf zugreifen und etwas damit machen. Also wenn Auto eine Method "Zerstören" hat, könnte jemand dies mit Deinem BMW machen.

    Aber nur dadurch, dass Dein BMW auf einem Parkplatz steht, auf dem Autos stehen können, bleibt es weiter ein BMW.

    Und wenn Du nun spezifische Dinge brauchst, dann musst Du prüfen. Beispiel Werkstatt. Du bringst ein Auto zur Werkstatt und die schaut dann: Ist es ein BMW? Ist es ein VW? Und wenn sie den richtigen Typ gefunden haben, dann können sie mit den Spezialitäten der Klasse anfangen (Und z.B. das Steuergerät auslesen. Das ist dann von mir aus bei VW und BMW unterschiedlich. Ggf. gibt es auch Autos ganz ohne Steuergerät...

    Hier passt das Beispiel also ganz gut - und zeigt, dass es keine wirkliche Konvertierung in etwas neues ist. Sondern lediglich ein "Ich nehme den BMW als Auto". Mal angenommen, es würde gehen und du machst aus BMW ein Auto - dann würde das BMW Steuergerät verschwinden. Wenn Du jetzt aus Auto ein "VW" machen willst, müsste ja irgendwoher das VW Steuergerät kommen. Dafür gibt es aber keine Quelle.

    Mit den besten Grüßen,

    Konrad

    • Als Antwort markiert Kargohose Donnerstag, 20. Dezember 2012 09:04
    Donnerstag, 20. Dezember 2012 09:02
  • Ok - das ist einleuchtend :) Dankeschön.
    Donnerstag, 20. Dezember 2012 09:04