From 8c76894ca7f965310b5deffaec9f368fe4afc751 Mon Sep 17 00:00:00 2001 From: xenia Date: Sun, 31 Aug 2025 12:00:58 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=94=D0=97,=20=D1=87=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D1=87=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/ru/otus/cars/CarBuilder.kt | 2 +- src/main/kotlin/ru/otus/cars/CarOutput.kt | 5 +++++ src/main/kotlin/ru/otus/cars/TankMouth.kt | 20 ++++++++++++++++++ src/main/kotlin/ru/otus/cars/TankSystem.kt | 24 ++++++++++++++++++++++ src/main/kotlin/ru/otus/cars/Vaz2107.kt | 7 ++++++- 5 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/ru/otus/cars/TankMouth.kt create mode 100644 src/main/kotlin/ru/otus/cars/TankSystem.kt diff --git a/src/main/kotlin/ru/otus/cars/CarBuilder.kt b/src/main/kotlin/ru/otus/cars/CarBuilder.kt index 224f46d..336b40d 100644 --- a/src/main/kotlin/ru/otus/cars/CarBuilder.kt +++ b/src/main/kotlin/ru/otus/cars/CarBuilder.kt @@ -7,5 +7,5 @@ sealed interface CarBuilder { /** * Собери машину */ - fun build(plates: Car.Plates): Car + fun build(plates: Car.Plates, tankSystem: TankSystem): Car } \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/CarOutput.kt b/src/main/kotlin/ru/otus/cars/CarOutput.kt index 875339f..4655226 100644 --- a/src/main/kotlin/ru/otus/cars/CarOutput.kt +++ b/src/main/kotlin/ru/otus/cars/CarOutput.kt @@ -8,4 +8,9 @@ interface CarOutput { * Скажи текущую скорость */ fun getCurrentSpeed(): Int + +// /** +// * Получить уровень топлива +// */ +// fun getFuelLevel(): Int } \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/TankMouth.kt b/src/main/kotlin/ru/otus/cars/TankMouth.kt new file mode 100644 index 0000000..85976db --- /dev/null +++ b/src/main/kotlin/ru/otus/cars/TankMouth.kt @@ -0,0 +1,20 @@ +package ru.otus.cars + +/** + * Горловина + */ +sealed interface TankMouth { + fun addFuel(liters: Int) + + class PetrolMouth : TankMouth { + override fun addFuel(liters: Int) { + println("Заправляемся бензином, $liters литров") + } + } + + class LpgMouth : TankMouth { + override fun addFuel(liters: Int) { + println("Заправляемся газом, $liters литров") + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/TankSystem.kt b/src/main/kotlin/ru/otus/cars/TankSystem.kt new file mode 100644 index 0000000..9dab176 --- /dev/null +++ b/src/main/kotlin/ru/otus/cars/TankSystem.kt @@ -0,0 +1,24 @@ +package ru.otus.cars + +class TankSystem(): TankMouth { + + override fun addFuel(liters: Int) { + val tank = Tank() + tank.addFuel(liters) + } + + fun getFuelLevel() { + val tank = Tank() + tank.getFuelLevel() + } + + private class Tank { + var currentFuelLevel: Int = 0 + fun getFuelLevel(): Int = currentFuelLevel + fun addFuel(liters: Int) { + currentFuelLevel += liters + } + } +} + + diff --git a/src/main/kotlin/ru/otus/cars/Vaz2107.kt b/src/main/kotlin/ru/otus/cars/Vaz2107.kt index be857d2..b5a4033 100644 --- a/src/main/kotlin/ru/otus/cars/Vaz2107.kt +++ b/src/main/kotlin/ru/otus/cars/Vaz2107.kt @@ -17,9 +17,10 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { } } - override fun build(plates: Car.Plates): Vaz2107 = Vaz2107("Зеленый").apply { + override fun build(plates: Car.Plates, tankSystem: TankSystem): Vaz2107 = Vaz2107("Зеленый").apply { this.engine = getRandomEngine() this.plates = plates + //tankSystem ??? } /** @@ -74,5 +75,9 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { override fun getCurrentSpeed(): Int { return this@Vaz2107.currentSpeed } + +// override fun getFuelLevel(): Int { +// return this@Vaz2107.??? +// } } } \ No newline at end of file From 8d078519ca06df0fae4cceee87d08095e16cde99 Mon Sep 17 00:00:00 2001 From: xenia Date: Mon, 8 Sep 2025 23:40:47 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=94=D0=97=20=D1=81=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/ru/otus/cars/Car.kt | 5 ++++ src/main/kotlin/ru/otus/cars/CarBuilder.kt | 2 +- src/main/kotlin/ru/otus/cars/CarInput.kt | 5 ++++ src/main/kotlin/ru/otus/cars/CarOutput.kt | 8 +++--- src/main/kotlin/ru/otus/cars/TankMouth.kt | 15 ++--------- src/main/kotlin/ru/otus/cars/TankSystem.kt | 29 +++++++++++++++------ src/main/kotlin/ru/otus/cars/Taz.kt | 23 ++++++++++++++++ src/main/kotlin/ru/otus/cars/Vaz2107.kt | 20 ++++++++++---- src/main/kotlin/ru/otus/cars/Vaz2108.kt | 15 +++++++++++ src/main/kotlin/ru/otus/cars/VazPlatform.kt | 3 +++ src/main/kotlin/ru/otus/cars/main.kt | 19 ++++++++++++++ 11 files changed, 113 insertions(+), 31 deletions(-) diff --git a/src/main/kotlin/ru/otus/cars/Car.kt b/src/main/kotlin/ru/otus/cars/Car.kt index 559978c..256519b 100644 --- a/src/main/kotlin/ru/otus/cars/Car.kt +++ b/src/main/kotlin/ru/otus/cars/Car.kt @@ -19,6 +19,11 @@ interface Car : CarInput { */ val carOutput: CarOutput + /** + * Горловина + */ + val tankMouth: TankMouth + /** * Получить оборудование */ diff --git a/src/main/kotlin/ru/otus/cars/CarBuilder.kt b/src/main/kotlin/ru/otus/cars/CarBuilder.kt index 336b40d..224f46d 100644 --- a/src/main/kotlin/ru/otus/cars/CarBuilder.kt +++ b/src/main/kotlin/ru/otus/cars/CarBuilder.kt @@ -7,5 +7,5 @@ sealed interface CarBuilder { /** * Собери машину */ - fun build(plates: Car.Plates, tankSystem: TankSystem): Car + fun build(plates: Car.Plates): Car } \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/CarInput.kt b/src/main/kotlin/ru/otus/cars/CarInput.kt index fc2478e..d595b08 100644 --- a/src/main/kotlin/ru/otus/cars/CarInput.kt +++ b/src/main/kotlin/ru/otus/cars/CarInput.kt @@ -13,4 +13,9 @@ interface CarInput { * Руль влево на [degrees] градусов */ fun wheelToLeft(degrees: Int) + + /** + * Заправиться + */ + fun addFuel(liters: Int) } \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/CarOutput.kt b/src/main/kotlin/ru/otus/cars/CarOutput.kt index 4655226..d8713dc 100644 --- a/src/main/kotlin/ru/otus/cars/CarOutput.kt +++ b/src/main/kotlin/ru/otus/cars/CarOutput.kt @@ -9,8 +9,8 @@ interface CarOutput { */ fun getCurrentSpeed(): Int -// /** -// * Получить уровень топлива -// */ -// fun getFuelLevel(): Int + /** + * Получить уровень топлива + */ + fun getFuelLevel(): Int } \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/TankMouth.kt b/src/main/kotlin/ru/otus/cars/TankMouth.kt index 85976db..6309418 100644 --- a/src/main/kotlin/ru/otus/cars/TankMouth.kt +++ b/src/main/kotlin/ru/otus/cars/TankMouth.kt @@ -4,17 +4,6 @@ package ru.otus.cars * Горловина */ sealed interface TankMouth { - fun addFuel(liters: Int) - - class PetrolMouth : TankMouth { - override fun addFuel(liters: Int) { - println("Заправляемся бензином, $liters литров") - } - } - - class LpgMouth : TankMouth { - override fun addFuel(liters: Int) { - println("Заправляемся газом, $liters литров") - } - } + class PetrolMouth : TankMouth + class LpgMouth : TankMouth } \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/TankSystem.kt b/src/main/kotlin/ru/otus/cars/TankSystem.kt index 9dab176..0bb9dac 100644 --- a/src/main/kotlin/ru/otus/cars/TankSystem.kt +++ b/src/main/kotlin/ru/otus/cars/TankSystem.kt @@ -1,21 +1,34 @@ package ru.otus.cars -class TankSystem(): TankMouth { +/** + * Топливная система + */ +class TankSystem(private val mouthType: TankMouth) { - override fun addFuel(liters: Int) { - val tank = Tank() - tank.addFuel(liters) + private val tank = Tank() + + fun addFuel(liters: Int) { + when (mouthType) { + is TankMouth.PetrolMouth -> tank.addPetrolFuel(liters) + is TankMouth.LpgMouth -> tank.addLpgFuel(liters) + } } - fun getFuelLevel() { - val tank = Tank() - tank.getFuelLevel() + fun getFuelLevel(): Int { + return tank.getFuelLevel() } private class Tank { var currentFuelLevel: Int = 0 fun getFuelLevel(): Int = currentFuelLevel - fun addFuel(liters: Int) { + + fun addPetrolFuel(liters: Int) { + println("Заправляемся бензином, $liters литров") + currentFuelLevel += liters + } + + fun addLpgFuel(liters: Int) { + println("Заправляемся газом, $liters литров") currentFuelLevel += liters } } diff --git a/src/main/kotlin/ru/otus/cars/Taz.kt b/src/main/kotlin/ru/otus/cars/Taz.kt index 49df937..49b9bc8 100644 --- a/src/main/kotlin/ru/otus/cars/Taz.kt +++ b/src/main/kotlin/ru/otus/cars/Taz.kt @@ -1,6 +1,25 @@ package ru.otus.cars +import kotlin.random.Random + object Taz: Car { + + /** + * Рандомный выбор горловины + */ + private fun getRandomTankMouth(): TankMouth { + return when (Random.nextInt(0, 2)) { + 0 -> TankMouth.PetrolMouth() + else -> TankMouth.LpgMouth() + } + } + + /** + * Горловина + */ + override val tankMouth: TankMouth + get() = getRandomTankMouth() + /** * Номерной знак */ @@ -36,4 +55,8 @@ object Taz: Car { override fun wheelToLeft(degrees: Int) { throw NotImplementedError("Руля нет") } + + override fun addFuel(liters: Int) { + throw IllegalArgumentException("Топливная система не найдена! Взрыв!") + } } \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/Vaz2107.kt b/src/main/kotlin/ru/otus/cars/Vaz2107.kt index b5a4033..2e45707 100644 --- a/src/main/kotlin/ru/otus/cars/Vaz2107.kt +++ b/src/main/kotlin/ru/otus/cars/Vaz2107.kt @@ -17,10 +17,11 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { } } - override fun build(plates: Car.Plates, tankSystem: TankSystem): Vaz2107 = Vaz2107("Зеленый").apply { + override fun build(plates: Car.Plates): Vaz2107 = Vaz2107("Зеленый").apply { this.engine = getRandomEngine() this.plates = plates - //tankSystem ??? + this.tankMouth = TankMouth.LpgMouth() + this.tankSystem = TankSystem(tankMouth) } /** @@ -41,6 +42,15 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { override lateinit var engine: VazEngine private set + override lateinit var tankMouth: TankMouth + private set + + override lateinit var tankSystem: TankSystem + + override fun addFuel(liters: Int) { + tankSystem.addFuel(liters) + } + /** * Семерка едет так */ @@ -76,8 +86,8 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { return this@Vaz2107.currentSpeed } -// override fun getFuelLevel(): Int { -// return this@Vaz2107.??? -// } + override fun getFuelLevel(): Int { + return tankSystem.getFuelLevel() + } } } \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/Vaz2108.kt b/src/main/kotlin/ru/otus/cars/Vaz2108.kt index 27b83b8..d7a1296 100644 --- a/src/main/kotlin/ru/otus/cars/Vaz2108.kt +++ b/src/main/kotlin/ru/otus/cars/Vaz2108.kt @@ -21,6 +21,8 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) { override fun build(plates: Car.Plates): Vaz2108 = Vaz2108("Красный").apply { this.engine = getRandomEngine() this.plates = plates + this.tankMouth = TankMouth.PetrolMouth() + this.tankSystem = TankSystem(tankMouth) } fun alignWheels(vaz2108: Vaz2108) { @@ -38,6 +40,15 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) { override lateinit var engine: VazEngine private set + override lateinit var tankMouth: TankMouth + private set + + override lateinit var tankSystem: TankSystem + + override fun addFuel(liters: Int) { + tankSystem.addFuel(liters) + } + /** * Восьмерка едет так */ @@ -78,5 +89,9 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) { override fun getCurrentSpeed(): Int { return this@Vaz2108.currentSpeed } + + override fun getFuelLevel(): Int { + return tankSystem.getFuelLevel() + } } } \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/VazPlatform.kt b/src/main/kotlin/ru/otus/cars/VazPlatform.kt index 079c2da..b8299e0 100644 --- a/src/main/kotlin/ru/otus/cars/VazPlatform.kt +++ b/src/main/kotlin/ru/otus/cars/VazPlatform.kt @@ -14,6 +14,9 @@ abstract class VazPlatform(override val color: String) : Car { // Абстрактное свойство двигателя abstract val engine: VazEngine + + // Абстрактное свойство топливной системы + abstract val tankSystem: TankSystem } // Перечисление двигателей ВАЗ diff --git a/src/main/kotlin/ru/otus/cars/main.kt b/src/main/kotlin/ru/otus/cars/main.kt index 978d0ef..fddb7d2 100644 --- a/src/main/kotlin/ru/otus/cars/main.kt +++ b/src/main/kotlin/ru/otus/cars/main.kt @@ -16,6 +16,9 @@ fun main() { techChecks() println("\n===> Taz...") println(Taz.color) + + println("\n===> Заправка") + addFuel(20) } fun driveCars() { @@ -90,4 +93,20 @@ fun repairEngine(car: VazPlatform) { is VazEngine.LADA_2107 -> println("Чистка карбюратора у двигателя объемом ${car.engine.volume} куб.см у машины $car") is VazEngine.SAMARA_2108 -> println("Угол зажигания у двигателя объемом ${car.engine.volume} куб.см у машины $car") } +} + +fun addFuel(liters: Int) { + + val carsList = listOf( + Vaz2107.build(Car.Plates("123", 77)), + Vaz2108.build(Car.Plates("321", 78)), + Taz + ) + + carsList.forEach { car -> + val output = car.carOutput + println("${car.javaClass.simpleName} - Уровень топлива до проверки: ${output.getFuelLevel()}") + car.addFuel(liters) + println("${car.javaClass.simpleName} - Уровень топлива после проверки: ${output.getFuelLevel()}") + } } \ No newline at end of file