【发布时间】:2011-02-04 01:36:23
【问题描述】:
为什么我不能将基类实例强制转换为派生类?
例如,如果我有一个扩展类 C 的 B 类,为什么我不能这样做?
B b=(B)(new C());
还是这个?
C c=new C();
B b=(B)c;
好的,让我更具体地说明我想要做什么。这是我所拥有的:
public class Base(){
protected BaseNode n;
public void foo(BaseNode x){
n.foo(x);
}
}
public class BaseNode(){
public void foo(BaseNode x){...}
}
现在我想创建一组扩展 Base 和 Basenode 的新类,如下所示:
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){
...
}
}
所以本质上我想通过扩展 Base 和 BaseNode 来为它们添加新功能,并为它们添加一个功能。此外,Base 和 BaseNode 应该可以单独使用。
如果可能的话,我真的很想在没有泛型的情况下这样做。
好吧,我最终弄明白了,部分感谢 Maruice Perry 的回答。
在Base 的构造函数中,n 被实例化为BaseNode。我所要做的就是在构造函数的派生类中将n 重新实例化为DerivedNode,它可以完美运行。
【问题讨论】:
-
首先,你需要制作BaseNode n;受保护,以便 Derived 可以看到它。
-
我的意思是没有泛型就没有办法做到这一点吗?就像我说的那样,我希望基类能够按原样使用——添加泛型会使它们使用起来更加麻烦,并删除了应该由 Base 封装的 BaseNode 类的封装。