cast bei Vererbung



  • Hallo,
    ich habe folgendes Problem mit diesen drei Klassen: Base, Derived und Control.

    // Base.java
    public class Base{
        public Base(){}
    
        public void basefunction(){
    	System.out.println("base function");
        }
    }
    
    // derived.java
    class Derived extends Base{
        public Derived(){}
    
        public void derivedfunction(){
    	System.out.println("derived function");
        }
    }
    
    // control.java
    class Control{
        public Control(){}
    
        public static void main(String[] argv){
    
    	Base x = new Derived();
    	x.basefunction();
    	((Derived)x).derivedfunction(); 
    	x.derivedfunction(); // Problem: x ist wieder "Base" - geht nicht !!!
    
    	x = (Derived)x; // Methode 0 : funzt nicht !!???
    	Derived w = (Derived) x; // Methode 1 : geht,
    	w.derivedfunction(); // aber x heisst jetz w und nicht mehr x
    	// todo:
    	// Methode 2 : das hier sollte funktionieren:
    //???
    	x.derivedfunction();
        }
    }
    

    Was muss ich machen, damit x also quasi vom Typ "Base" permanent in den Typ "Derived" umgewandelt wird?

    Danke



  • Nene, nicht ständig umwandeln.
    Wenn du Derived-Methoden brauchst, dann verwende eine Derived-Referenz.



  • hm ? was ist eine Referenz in java? wie sieht das zB mit einer Zeile Code aus?



  • Base x = new Derived();
    

    x ist eine Referenz auf ein Derived-Objekt, hat aber selber den Typ Base. Warum gibst du ihr nicht auch einfach den Typ Derived?



  • Tja mein eigentliches Problem ist:
    Ich habe vier Klassen:
    "Vector", davon abgeleitet "MyVector" und "Client", davon abgeleitet "ConcClient".
    Die Klasse "Client", hat die Deklaration:

    Vector vecData;
    

    "ConcClient", also ein konkreter Klient, sollte mit seinen Funktionen, die Funktionalitaeten von "MyVector" nutzen koennen.

    vecData = new MyVector;
    // geht aber eben nicht
    

    Ich habe es so konstruiert, damit ich die Moeglichkeit habe "MyVector" oder "ConcClient" irgendwann austauschen zu koennen.
    Mit etwa mit einer verbesserten Implementierung o.ae.

    Alles was ich sicher weiss ist aber, dass ich etwas "vectorartiges" verwenden werde bei den Clienten.
    Also ich bei "Client" schon eine Variable vom Typ "Vector" eingebaut haben will und nicht erst bei "ConcClient".

    Fragen:
    Jetzt muesste ich wohl entweder alle Funktionsaufrufe in "ConcClient" mit

    ((MyVector)vecData).function();
    

    durchfuehren (damit wuerden mir die Methoden in "ConcClient" schon wieder sehr speziell auf "MyVector", falls ich ihn etwa mal mit "FoosVector" austauschen will...) oder es direkt aus "Client" rausschmeissen und erst in der davon abgeleiteten "ConcClient" definieren. (Was mir aber eben nicht ganz logisch erscheint.)

    Das will ich eigentlich eben beides nicht, also gibt es ne Moeglichkeit einfach "vecData" fuer die Klasse "ConcClient" permanent in den Typ "MyVector" umzuwandeln ???

    Hoffentlich wars nicht zu kryptisch... 😉



  • mach doch ein Iterface, das die Methode function() hat. Dann implementieren die ConcClient und MyVector dieses Interface. So brauchst du keinen cast.

    Du brauchst einfach ein gemeinsames Interface das ConcClient und MyVector implementieren. Dann erst kannst du dir das Casten ersparen.


Log in to reply