Objekte casten - Informationsverlust?



  • Hallo ich habe eine Klasse mit zwei verschiedenen Konstruktoren. Dem einen Konstruktor wird als Parameter ein Objekt vom typ x übergeben dem 2ten vom typ y. Sowohl x als auch y sind Unterklassen von Z. Pseudocode:

    [java]
    public class V {

    Z _z = null; //z ist Superklasse von x und y

    public V(X _x) {
    _z = _x;
    }

    public V(Y _y) {
    _z = _y;
    }
    }
    [/code]

    GEht beim cast im Konstruktor jetzt informationen verloren? Klasse x und y implementieren methoden bzw membervariablen die Z nicht hat. gehen diese beim cast verloren?

    Falls das ohne Problem geht, wäre es ein besserer stil nur einen Konstruktor zu machen (mit Z als Parameter) und dan beim erstellen eines neuen objekts den Parameter vorher zu casten?

    Die Sache ist das ich eben die Klasse V mit zwei unterschiedlichen Übergabe - Objekten verwenden will. In der Klasse V wollte ich dann einen aufruf machen ala

    if( _z instanceof 😵 do s.th.

    if( _z instanceof Y) do s.th else..

    irgendwie gefällt mir das alles nicht... *HELP* 🙂



  • Hallo,

    also es gehen keine Informationen verloren, da X und Y
    ja beide auch vom Typ Z sind, es handelt sich ja bei Vererbungen
    um "is-a" Beziehungen.

    Was sich letztendlich hinter der Referenz _z verbirgt ist ein Objekt
    vom Typ X oder Y, so kannst du durch casten immer noch die überschriebenen
    Methoden in X oder Y aufrufen und mit

    instance of
    

    auch herausfinden zu welcher Klasse das Objekt gehört,
    welches sich hinter _z versteckt.

    Allerdings ist dies nicht notwendig, da es der Polymorphismus in java
    selber regelt. Also wenn du in X und Y ein Methode test() von Z
    überschreibst, wird immer die richtige benutzt, wenn du die
    Referenz _z folgendermaßen benutzt _z.test().

    Falls du Z nicht instanziieren willst, würde ich die Klasse Z abstract
    machen.

    Hoffe es hilft ein wenig,

    Gamba



  • jep hat geholfen. so kann ich es abgeben und warten was der chef dazu meint..


Anmelden zum Antworten