扩展一个没有构造函数的 class
Extend a class who has no constructor
我有一个外部 class 我无法修改,我想为与我的项目相关的 class 添加自定义功能,所以我创建了一个 class 来扩展它为了添加我需要的额外方法。
问题是 Car class 没有构造函数,所以我不能使用 super,创建 Car 对象的唯一方法是通过 returns a完全填充的汽车对象。
public class Car {
//The only way to create a car
public native Car readFromFile (String file);
//Many other variables and methods
}
还有我的习惯class:
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
}
}
或者我应该创建一个新的构造函数来复制所有父变量吗?
非常感谢您的帮助!
我怀疑你的问题可能是基于误解。您的示例 class Car
有一个默认构造函数,相当于这样写:
public Car() { }
如果 且仅当 a class 未声明任何显式构造函数时,才添加默认构造函数。
如果您将 CustomCar
声明为 Car
的子 class,它可以使用默认的 Car
构造函数。
第二个问题是您已将 readFromFile
声明为
public native Car readFromFile (String file);
必须
public static native Car readFromFile (String file);
可用。 (如果 readFromFile
确实是一个实例方法,并且确实是创建 Car
实例的唯一方法,那么您就会遇到引导问题。如何创建第一个 Car
?)
话虽如此,如果您的 Car
class 的默认构造函数不起作用(即它没有正确初始化 Car
的状态),那么您有一个问题:
如果CustomCar(...)
简单地使用Car()
,superclass将无法正确初始化。
如果它 class Car.readFromFile()
结果将是一个 Car
的新对象,而不是 CustomCar
.
可能有一些方法可以解决这个问题。例如:
您可以向 Car
添加一个显式构造函数来执行必要的初始化。
您可以将 CustomCar
实现为真实 Car
实例的包装器,CustomCar
使用本机 Car
方法实例化该实例。然后将 CustomCar
实现委托给包装的实例。如果没有其他问题,你应该可以让 CustomCar
成为 Car
.
的子类型
哪种方法更好?这很难说。这取决于您的 真实 用例的详细信息;例如本机方法创建的对象是否具有隐藏状态或特殊 "identity related" 属性? (为什么要使用本机代码创建它?)
如果这些变通办法无法奏效,那么您就有问题了。 Car::readFromFile
不可能是任何 Car
subclass 需要的构造函数。
我有一个外部 class 我无法修改,我想为与我的项目相关的 class 添加自定义功能,所以我创建了一个 class 来扩展它为了添加我需要的额外方法。
问题是 Car class 没有构造函数,所以我不能使用 super,创建 Car 对象的唯一方法是通过 returns a完全填充的汽车对象。
public class Car {
//The only way to create a car
public native Car readFromFile (String file);
//Many other variables and methods
}
还有我的习惯class:
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
}
}
或者我应该创建一个新的构造函数来复制所有父变量吗?
非常感谢您的帮助!
我怀疑你的问题可能是基于误解。您的示例 class Car
有一个默认构造函数,相当于这样写:
public Car() { }
如果 且仅当 a class 未声明任何显式构造函数时,才添加默认构造函数。
如果您将 CustomCar
声明为 Car
的子 class,它可以使用默认的 Car
构造函数。
第二个问题是您已将 readFromFile
声明为
public native Car readFromFile (String file);
必须
public static native Car readFromFile (String file);
可用。 (如果 readFromFile
确实是一个实例方法,并且确实是创建 Car
实例的唯一方法,那么您就会遇到引导问题。如何创建第一个 Car
?)
话虽如此,如果您的 Car
class 的默认构造函数不起作用(即它没有正确初始化 Car
的状态),那么您有一个问题:
如果
CustomCar(...)
简单地使用Car()
,superclass将无法正确初始化。如果它 class
Car.readFromFile()
结果将是一个Car
的新对象,而不是CustomCar
.
可能有一些方法可以解决这个问题。例如:
您可以向
Car
添加一个显式构造函数来执行必要的初始化。您可以将
CustomCar
实现为真实Car
实例的包装器,CustomCar
使用本机Car
方法实例化该实例。然后将CustomCar
实现委托给包装的实例。如果没有其他问题,你应该可以让CustomCar
成为Car
. 的子类型
哪种方法更好?这很难说。这取决于您的 真实 用例的详细信息;例如本机方法创建的对象是否具有隐藏状态或特殊 "identity related" 属性? (为什么要使用本机代码创建它?)
如果这些变通办法无法奏效,那么您就有问题了。 Car::readFromFile
不可能是任何 Car
subclass 需要的构造函数。