Ваш образ мышления правильный, возможно, только ваше исполнение не так.
Учитывая следующие классы:
public class LivingRoomItem
public class Sofa extends LivingRoomItem
public class Table extends LivingRoomItem
public class Lighting extends LivingRoomItem
Вы можете обращаться со всеми из них, как они LivingRoomItem
В вашем методе CalculatePrice вы будете использовать LivingRoomItem
, как ожидается, для обработки всех объектов:
public static BigDecimal calculateTotalPrice(List<LivingRoomItem> items) {
return items.stream().map(item -> item.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
}
Поскольку вы создаете все объекты как сами по себе (не как LivingRoomItem
)и, устанавливая цену, она должна работать правильно:
public static void main(String[] args) {
Sofa sofa = new Sofa();
sofa.setPrice(BigDecimal.valueOf(200L));
Lighting lighting = new Lighting();
lighting.setPrice(BigDecimal.valueOf(652L));
Table table = new Table();
table.setPrice(BigDecimal.valueOf(598L));
System.out.println(PriceUtil.calculateTotalPrice(Arrays.asList(sofa, lighting, table)));
}
Результат: ![enter image description here](https://i.stack.imgur.com/7ni5U.png)
Я получил вашу точку в toString
,для целей вашего упражнения вы можете использовать оператор instanceof внутри вашего суперкласса toString
:
Пример (внутри вашего LivingRoomItem
класса):
return (this instanceof Sofa ? "Superclass... Subclass: Sofa" : "Regular LivingRoomItem toString");
Но, как я уже сказал, я считаю правильным показывать Object
как суперкласс :) И только показывать LivingRoomItem
на подклассах.
Надеюсь, я смог вам помочь!