В чем недостаток?Класс MountainBike
вызывает конструктор Bicycle
, и поэтому вы увидите, что результат "A Bicycle был создан".прежде чем вы увидите «Горный велосипед был создан».выход.
Если вы говорите, что не хотите видеть «Велосипед создан».вывод при создании MountainBike
, вы можете захотеть обернуть создание Bicycle
или MountainBike
другим классом, который знает, какой вывод отображать.Но по сути то, что вы видите в выводе, это то, что вы ожидаете увидеть как MountainBike
- это также Bicycle
.
public class BikeWarehouse {
public Bicycle buildBicycle(int speed) {
Bicycle bicycle = new Bicycle(speed);
System.out.println("A Bicycle has been created.");
return bicycle;
}
public MountainBike buildMountainBike(int seatHeight, int speed) {
MountainBike mountainBike = new MountainBike(seatHeight, speed);
System.out.println("A MountainBike has been created.");
return mountainBike;
}
}
Или вы можете поставить toString()
метод в классах Bicycle
и MountainBike
, а затем при создании любого из них вы можете просто иметь:
System.out.println("A " + bike + " has been created");
Очевидно, toString()
из Bicycle
вернет "Bicycle"
и toString()
из MountainBike
вернуло бы "MountainBike"
.
Я также не слишком часто использую аспекты, но я считаю, что возможно сделать что-то подобное вышеупомянутому, не засоряя вашу базу кода (если вы обнаружите, чтовыше "сорить"), но вы можете войти в систему создания ваших объектов, используя что-то вроде AspectJ.Я обычно не большой поклонник слишком многих решений на основе аспектов, но, возможно, стоит подумать.