Warum kann ich eine Basisklasseninstanz nicht in eine abgeleitete Klasse umwandeln?Java; Casting-Basisklasse in abgeleitete Klasse
Zum Beispiel, wenn ich eine Klasse B habe, die eine Klasse C erweitert, warum kann ich das nicht tun?
B b=(B)(new C());
oder das?
C c=new C();
B b=(B)c;
Okay lassen Sie mich genauer sein, was ich versuche zu tun. Hier ist, was ich habe:
public class Base(){
protected BaseNode n;
public void foo(BaseNode x){
n.foo(x);
}
}
public class BaseNode(){
public void foo(BaseNode x){...}
}
Jetzt habe ich einen neuen Satz von Klassen erstellen möchten, die Basis und Basenode verlängern, wie folgt aus:
public class Derived extends Base(){
public void bar(DerivedNode x){
n.bar(x);//problem is here - n doesn't have bar
}
}
public class DerivedNode extends BaseNode(){
public void bar(BaseNode){
...
}
}
So im Wesentlichen ich neue Funktionalität zur Basis und BaseNode hinzufügen möchten indem Sie beide erweitern und beiden eine Funktion hinzufügen. Darüber hinaus sollten Base und BaseNode für sich alleine verwendet werden können.
Ich würde wirklich gerne dies ohne Generika tun, wenn möglich.
In Ordnung, also habe ich es herausgefunden, zum Teil dank Maruice Perry's Antwort.
In meinem Konstruktor für Base
wird n
instanziiert als BaseNode
. Alles, was ich zu tun hatte, war wieder instanziieren n
als DerivedNode
in meiner abgeleiteten Klasse im Konstruktor, und es funktioniert perfekt.
Zunächst müssen Sie BaseNode n machen; geschützt, damit Abgeleitetes es sehen kann. – Joel
Woops (geändert). – Cam
Ich meine, gibt es keinen Weg, dies ohne Generika zu tun? Wie ich schon sagte, ich möchte, dass die Basisklassen unverändert nutzbar sind - das Hinzufügen von Generics würde sie umständlicher machen und die Kapselung der BaseNode-Klasse entfernen, die von Base eingekapselt werden soll. – Cam