我有一个无法修改的外部类,我想向与我的项目相关的类中添加自定义功能,因此我创建了一个类,对该类进行了扩展以添加所需的额外方法。
问题是Car类没有构造函数,所以我不能使用super,创建Car对象的唯一方法是通过本机方法返回完全填充的Car对象。
public class Car {
//The only way to create a car
public native Car readFromFile (String file);
//Many other variables and methods
}
我的自定义类:
import com.example.Car;
public class CustomCar extends Car {
public void extraMethod1(){
//do something using Car variables
}
}
很显然我无法转换为(CustomCar),因为我有ClassCastException,所以如何从该本机方法获取Car并在该对象上使用CustomCar的方法?
我应该在CustomCar中有一个可变的Car并在CustomCar方法中使用它吗?
import com.example.Car;
public class CustomCar {
Car car;
public void extraMethod1(){
car.doSomething(); //do something using Car variables
}
}
还是我应该创建一个复制所有父变量的新构造函数?
非常感谢您的帮助!
答案 0 :(得分:1)
我怀疑您的问题可能基于误解。您的示例类Car
的默认构造函数等效于编写以下代码:
public Car() { }
仅当类没有声明任何显式构造函数时,才会添加默认构造函数。
如果您将CustomCar
声明为Car
的子类,则可以使用默认的Car
构造函数。
第二个问题是您已将readFromFile
声明为
public native Car readFromFile (String file);
必须是
public static native Car readFromFile (String file);
可用。 (如果readFromFile
确实是实例方法,并且实际上是创建Car
实例的唯一方法,那么您将遇到引导问题。如何创建第一个Car
?)>
话虽如此,如果您的Car
类的默认构造函数不起作用(即,它没有正确初始化Car
的状态),那么您就会遇到问题:
如果CustomCar(...)
仅使用Car()
,则超类将无法正确初始化。
如果将其分类为Car.readFromFile()
,则结果将是一个Car
而不是CustomCar
的新对象。
可能有一些方法可以解决此问题。例如:
您可以向Car
添加一个显式构造函数,以执行必要的初始化。
您可以将CustomCar
用作实际Car
实例的包装器,该实例CustomCar
使用本机Car
方法实例化。然后,将CustomCar
实现委派给包装实例。如果没有其他问题,则应该可以将CustomCar
设为Car
的子类型。
哪种方法更好?这很难说。这取决于您的实际用例的详细信息;例如通过本机方法创建的对象是否具有隐藏状态或特殊的“身份相关”属性? (为什么要使用本机代码创建它?)
如果有这些变通办法无法解决的原因,则您有问题。 Car::readFromFile
不可能成为任何Car
子类所需的构造函数。