扩展一个没有构造函数的 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 需要的构造函数。