Pourquoi ne puis-je pas convertir une instance de classe de base en classe dérivée? Par exemple, si j'ai une classe B qui étend une classe C, pourquoi ne puis-je pas le faire?Java; conversion de la classe de base en classe dérivée
B b=(B)(new C());
ou this?
C c=new C();
B b=(B)c;
Bon laissez-moi être plus précis quant à ce que je suis en train de faire. Voici ce que j'ai:
public class Base(){
protected BaseNode n;
public void foo(BaseNode x){
n.foo(x);
}
}
public class BaseNode(){
public void foo(BaseNode x){...}
}
Maintenant, je veux créer un nouvel ensemble de classes qui s'étendent la base et Basenode, comme ceci:
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){
...
}
}
donc essentiellement que je veux ajouter de nouvelles fonctionnalités à la base et BaseNode en les prolongeant tous les deux, et en ajoutant une fonction à chacun d'eux. De plus, Base et BaseNode devraient pouvoir être utilisés seuls.
Je voudrais vraiment faire cela sans génériques si possible. D'accord, j'ai fini par trouver une solution, en partie grâce à la réponse de Maruice Perry. Dans mon constructeur pour Base
, n
est instancié en tant que BaseNode
. Tout ce que j'avais à faire était de ré-instancier n
en tant que DerivedNode
dans ma classe dérivée dans le constructeur, et cela fonctionne parfaitement.
Tout d'abord, vous devez créer BaseNode n; protégé afin que Derived puisse le voir. – Joel
Woops (l'a changé). – Cam
Je veux dire qu'il n'y a aucun moyen de le faire sans génériques? Comme je l'ai dit, je veux que les classes de base soient utilisables telles quelles, l'ajout de génériques les rendrait plus encombrantes à utiliser et supprime l'encapsulation de la classe BaseNode qui est censée être encapsulée par Base. – Cam