Да, просто добавьте конструктор в Truck. Возможно, вы захотите добавить конструктор в Car, но не обязательно публично:
public class Car {
protected Car(Car orig) {
...
}
public class Truck extends Car {
public Truck(Car orig) {
super(orig);
}
...
}
Как правило, лучше всего делать классы либо листовыми (и вы можете пометить их как окончательные), либо абстрактными.
Выглядит так, как будто вы хотите Car
объект, а затем тот же экземпляр превращается в Truck
. Лучший способ сделать это - делегировать поведение другому объекту в Car
(Vehicle
). Итак:
public final class Vehicle {
private VehicleBehaviour behaviour = VehicleBehaviour.CAR;
public void becomeTruck() {
this.behaviour = VehicleBehaviour.TRUCK;
}
...
}
Если вы реализуете Cloneable
, вы можете «автоматически» скопировать объект в экземпляр того же класса. Однако с этим связан ряд проблем, в том числе необходимость копировать каждое поле изменяемых объектов, которое подвержено ошибкам и запрещает использование final.