我觉得这是不可能的,但如果不是这样,那将非常有用。
我正在尝试扩展父类,以使子类仅具有新方法,没有新构造函数,没有新字段。因此,子类的基础数据结构与父类相同。当我想给内置的Java类(例如Vector3d
)提供附加功能时,往往会发生这种情况。假设基础数据是相同的,则有可能以任何方式将初始化为父类的对象下放到子类,因此我可以使用添加的功能。作为我的意思的示例,请参见下文
import javax.vecmath.Vector3d;
public class Vector3dPlus extends Vector3d{
//same fields, same constructors as Vector3d
public double extraMethod(){
return x+y+z;
}
}
尝试使用添加到Vector3d的新方法
import javax.vecmath.Vector3d;
public class Test {
public static void main(String[] args) {
Vector3d basic=new Vector3d(1,2,3);
useExtraMethod(basic); //this line correctly raises an exception, but is there a way around that
}
public static void useExtraMethod(Vector3dPlus plus){
System.out.println(plus.extraMethod());
}
}
显然,java对此感到不安,因为通常我们不能保证
Vector3dPlus
方法将与所有Vector3d
一起使用。但是无论如何,我可以对java说底层的数据结构是相同的,因此允许从所有Vector3d
到Vector3dPlus
的所有下转换。我目前的处理方式是将所有其他方法都放在通用工具类中,但这显然有点可怕
最佳答案
您可以通过方法重载和复制构造函数来实现:
public class Vector3dPlus extends Vector3d {
public Vector3dPlus(Vector3d vector) {
super( ... ); // parameters from vector
}
// rest of your Vector3dPlus code
}
并在您的测试类中,重载方法:
public class Test {
public static void useExtraMethod(Vector3d vector) {
useExtraMethod(new Vector3dPlus(vector));
}
public static void useExtraMethod(Vector3dPlus plus){
System.out.println(plus.extraMethod());
}
public static void main(String[] args) {
Vector3d basic=new Vector3d(1,2,3);
useExtraMethod(basic); // this line works now
}
}