Ein Objekt von zwei Klassen



  • Hallo,

    ich habe eine Klasse A und eine Klasse B, die von A abgeleitet ist. Beide Klassen besitzen gleiche Eigentschaftsnamen, aber unterschiedliche Eigenschaften. Zuerst hatte ich nur eine Klasse A und ein Objekt C vom Typ A. Jetzt möchte ich jedoch zwischen beiden Klassen umschalten. Sprich, ich möchte, dass in einem Fall das Objekt vom Typ A und in einem anderem vom Typ B ist.

    Bin für jeden Rat dankbar!



  • Dann musst du eine Referenz einer Basisklasse benutzen oder eines Interfaces, welches von beiden Klassen implementiert wird.

    Beide Klassen besitzen gleiche Eigentschaftsnamen, aber unterschiedliche Eigenschaften.

    Diesen Satz kann ich leider nicht compilieren. 😕



  • ZzetT schrieb:

    Beide Klassen besitzen gleiche Eigentschaftsnamen, aber unterschiedliche Eigenschaften.

    Bezieht sich das vielleicht auf die Datentypen ?



  • Damit meine ich sowas zum Beispiel:
    class A
    {
    int feld[] = {1,2,3,4,5};
    int feld2[] = {6,7,8,9,10};
    }

    class B extends A
    {
    int feld2[] = {15,16,17,18,19};
    }

    Als ich mein Programm geschrieben hatte, hatte ich nur Klasse A verwendet. Später kam Klasse B hinzu, die ich genauso wie Klasse A verwenden möchte. Ich habe also im gesamten Quellcode anfangs ein Objekt vom Typ A benutzt. Dies soll nun aber Wahlweise zur Laufzeit bestimmt werden ob es vom Typ A oder B sein soll.

    Im Quellcode steht dann sowas wie:

    System.out.println(C.feld2[3]);  //Dies würde ja sowohl für Klasse A als auch für B gehen
    


  • Bist du dir über die Vererbungsbeziehung, dass B von A erbt, im klaren und bist du sicher, dass du das willst? Dann sehe ich auch kein Problem, denn du kannst jedes B-Objekt wie ein A-Objekt benutzen.
    btw. ist direktes Zugreifen auf Datengelemente evil. Du kannst dir nen Getter für das Array basteln:

    class A
    {
        // Bitte beachten, dass es in Java üblich ist, int[] foo und nicht int foo[]
        // zu schreiben.
        int[] feld = new int[]  {3, 5, 9, 2};
    
        int[] getFeld()    {return feld;}
    }
    
    ...
    
    A myA = new A();
    myA.getFeld()[2] = 5;        // drittes Element im Array setzen.
    


  • Falls du allerdings, was ich eher glaube, wahlweise A oder B benutzen willst, ohne dass B von A erbt, kannst du ein gemeinsames Interface von beiden Klassen implementieren lassen:

    interface MyInterface
    {
        int[] getFeld();
    }
    

    Im Code benutzt du dann eine Interface-Referenz:

    ...
    
    MyInterface x;
    x = new A();
    // ODER
    x = new B();
    
    System.out.println( x.getFeld()[0] );
    
    ...
    


  • Könnte ich auch meine Oberklasse als interface deklarieren und in die Unterklasse einfach das interface implementieren?

    Vererbung ist mir recht wichtig, da in der Oberklasse eine ganze Menge Strings enthalten sind und diese zu kopieren kostet doppelten Speicherplatz.

    Und auch wenn das mit dem getFeld sicherer ist, so möchte ich wirklich gerne bei meinem Direktzugriff bleiben, da das den Quellcode dann nicht noch mehr aufbläht, zumal es wirklich nur konstante Werte sind, die nur gelesen werden.



  • Ob die Vererbung angemessen ist, kann ich nicht beurteilen, sondern nur du. Aber wenn du eh schon B von A erben lässt, dann sehe ich wirklich das Problem nicht mit

    Später kam Klasse B hinzu, die ich genauso wie Klasse A verwenden möchte.

    😕

    Und auch wenn das mit dem getFeld sicherer ist, so möchte ich wirklich gerne bei meinem Direktzugriff bleiben, da das den Quellcode dann nicht noch mehr aufbläht

    Das bläht den Code nicht auf, die getter werden selbstverständlich geinlined. Außerdem ist es total unklug gleich im vornherein schlechtes Design vorzuziehen, nur weil du _denkst_, das könnte den Code aufblähen.


Anmelden zum Antworten