Я подозреваю, что ваш вопрос может быть основан на неправильном представлении. Ваш пример класса 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
.