Как Джон Скит сказал в своем комментарии, вы не можете бросить его, если он не является MountainBike
и является просто равным Bicycle
. То, что вы можете сделать, это создать конструктор в MountainBike
, который принимает Bicycle
в качестве параметра:
public MountainBike(Bicycle bicycle) {
// Copy bicycle's properties
}
И называют это вместо:
MountainBike mb = new MountainBike(Bicycle bicycle);
Если вы не можете изменить MountainBike
класс по какой-либо причине , вы также можете создать заводской метод static
:
public class MountainBikeFactory {
public static MountainBike createMountainBike(Bicycle bicycle) {
MountainBike mb = new MountainBike();
// Copy bicycle's properties
return mb;
}
}
И назвать его :
MountainBike mb = MountainBikeFactory.create(bicycle);
Edit: После просмотра информации вы публикуемую в качестве комментария по этому вопросу, похоже, что вы могли бы попробовать шаблон строитель. Строитель будет содержать все атрибуты как переменные (да, он будет длинным с более 100 переменными), и когда вы обнаружите атрибуты из вашего файла, установите их в построителе. Затем, в конце, когда вы вызываете метод build()
строителя, разрешите ему разрешить какой тип байка создавать и использовать полиморфизм для обработки групп атрибутов w.r.t. который вы создали.
Например:
public class BikeBuilder {
private String model;
private String wheelSize;
private String shocks;
private String racingHandleBarType;
// returns "this" so you can chain calls, common in builders, not necessary
public BikeBuilder setModel(String model) {
this.model = model;
return this;
}
// Other setters
public Bike build() {
Bike bike;
// Determine which kind of bike it is and create it
if (shocks != null) {
bike = new MountainBike();
handleMountainBike((MountainBike) bike);
} else if (racingHandleBarType != null) {
bike = new RacingBike();
handleRacingBike((RacingBike) bike);
} else {
bike = new Bike();
}
handleCommonAttributes(bike);
return bike;
}
// All bikes have these attributes
private void handleCommonAttributes(Bike bike) {
bike.setModel(model);
bike.setWheelSize(wheelSize);
}
private void handleMountainBike(MountainBike bike) {
bike.setShocks(shocks);
}
private void handleRacingBike(RacingBike bike) {
bike.setRacingHandleBarType(racingHandleBarType);
}
}
Это позволяет построить велосипед на ходу и решить его тип в конце чтения в файле, а не в начале. Он служит своего рода контейнером. Если у вас несколько типов, которые расширяют Bike
, вы можете создавать для них новые методы. По крайней мере, вы начнете.
Нет, если вы получаете исключение, потому что объект, с которым вы работаете *, - это просто «велосипед». Вы не можете изменить тип объекта после создания. –
Хорошо, спасибо, я попробую. Есть ли эффективный способ установить все атрибуты (у меня более ста!) От велосипеда до горного велосипеда? –
Есть ли причина, по которой вы не можете создать MountainBike для начала? –