扩展没有构造函数的类

时间:2019-03-14 10:50:18

标签: java inheritance extends

我有一个无法修改的外部类,我想向与我的项目相关的类中添加自定义功能,因此我创建了一个类,对该类进行了扩展以添加所需的额外方法。

问题是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

    }
}

还是我应该创建一个复制所有父变量的新构造函数?

非常感谢您的帮助!

1 个答案:

答案 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子类所需的构造函数。