From 995418e28b1063dee22e5e59e5838b692be6353c Mon Sep 17 00:00:00 2001 From: AT Date: Mon, 2 Dec 2024 23:36:57 +0300 Subject: [PATCH] Implemented homework --- src/main/kotlin/ru/otus/cars/Car.kt | 4 +++ src/main/kotlin/ru/otus/cars/CarFactory.kt | 4 +-- src/main/kotlin/ru/otus/cars/CarOutput.kt | 2 ++ src/main/kotlin/ru/otus/cars/Taz.kt | 5 +++ src/main/kotlin/ru/otus/cars/Vaz2107.kt | 22 +++++++++++++ src/main/kotlin/ru/otus/cars/Vaz2108.kt | 22 +++++++++++++ src/main/kotlin/ru/otus/cars/VazPlatform.kt | 4 +++ src/main/kotlin/ru/otus/cars/fuel/Tank.kt | 8 +++++ .../kotlin/ru/otus/cars/fuel/TankMouth.kt | 19 ++++++++++++ src/main/kotlin/ru/otus/cars/fuel/VazTank.kt | 14 +++++++++ .../ru/otus/cars/gasstation/GasStation.kt | 31 +++++++++++++++++++ src/main/kotlin/ru/otus/cars/main.kt | 31 +++++++++++++++++++ 12 files changed, 164 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/ru/otus/cars/fuel/Tank.kt create mode 100644 src/main/kotlin/ru/otus/cars/fuel/TankMouth.kt create mode 100644 src/main/kotlin/ru/otus/cars/fuel/VazTank.kt create mode 100644 src/main/kotlin/ru/otus/cars/gasstation/GasStation.kt diff --git a/src/main/kotlin/ru/otus/cars/Car.kt b/src/main/kotlin/ru/otus/cars/Car.kt index 559978c..84faa74 100644 --- a/src/main/kotlin/ru/otus/cars/Car.kt +++ b/src/main/kotlin/ru/otus/cars/Car.kt @@ -1,5 +1,7 @@ package ru.otus.cars +import ru.otus.cars.fuel.TankMouth + /** * Машина целиком */ @@ -28,4 +30,6 @@ interface Car : CarInput { * Внутренний статический класс - номерой знак */ data class Plates(val number: String, val region: Int) + + val tankMouth: TankMouth } \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/CarFactory.kt b/src/main/kotlin/ru/otus/cars/CarFactory.kt index 3b8f03e..093217d 100644 --- a/src/main/kotlin/ru/otus/cars/CarFactory.kt +++ b/src/main/kotlin/ru/otus/cars/CarFactory.kt @@ -34,8 +34,8 @@ object Togliatti : CarFactory { override fun buildCar(builder: CarBuilder, plates: Car.Plates): Car { return when (builder) { - is Vaz2107.Companion -> return buildVaz2107(plates) - is Vaz2108.Companion -> return buildVaz2108(plates) + is Vaz2107.Companion -> buildVaz2107(plates) + is Vaz2108.Companion -> buildVaz2108(plates) } } } \ 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..0257eac 100644 --- a/src/main/kotlin/ru/otus/cars/CarOutput.kt +++ b/src/main/kotlin/ru/otus/cars/CarOutput.kt @@ -8,4 +8,6 @@ interface CarOutput { * Скажи текущую скорость */ fun getCurrentSpeed(): Int + + fun getFuelContents(): Int } \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/Taz.kt b/src/main/kotlin/ru/otus/cars/Taz.kt index 49df937..bf3a9db 100644 --- a/src/main/kotlin/ru/otus/cars/Taz.kt +++ b/src/main/kotlin/ru/otus/cars/Taz.kt @@ -1,5 +1,7 @@ package ru.otus.cars +import ru.otus.cars.fuel.TankMouth + object Taz: Car { /** * Номерной знак @@ -36,4 +38,7 @@ object Taz: Car { override fun wheelToLeft(degrees: Int) { throw NotImplementedError("Руля нет") } + + override val tankMouth: TankMouth + get() = throw NotImplementedError("Взрыв") } \ 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 be857d2..2a236fb 100644 --- a/src/main/kotlin/ru/otus/cars/Vaz2107.kt +++ b/src/main/kotlin/ru/otus/cars/Vaz2107.kt @@ -1,5 +1,8 @@ package ru.otus.cars +import ru.otus.cars.fuel.Tank +import ru.otus.cars.fuel.TankMouth +import ru.otus.cars.fuel.VazTank import kotlin.random.Random /** @@ -17,9 +20,18 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { } } + private fun getTank() : Tank{ + val tank = VazTank() + val tankMouth = TankMouth.LpgTankMouth(tank) + tank.mouth = tankMouth + return tank + } + override fun build(plates: Car.Plates): Vaz2107 = Vaz2107("Зеленый").apply { this.engine = getRandomEngine() this.plates = plates + this.tank = getTank() + this.tankMouth = this.tank.mouth } /** @@ -40,6 +52,12 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { override lateinit var engine: VazEngine private set + override lateinit var tank: Tank + private set + + override lateinit var tankMouth: TankMouth + private set + /** * Семерка едет так */ @@ -74,5 +92,9 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { override fun getCurrentSpeed(): Int { return this@Vaz2107.currentSpeed } + + override fun getFuelContents(): Int { + return this@Vaz2107.tank.getContents() + } } } \ 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..702d481 100644 --- a/src/main/kotlin/ru/otus/cars/Vaz2108.kt +++ b/src/main/kotlin/ru/otus/cars/Vaz2108.kt @@ -1,5 +1,8 @@ package ru.otus.cars +import ru.otus.cars.fuel.Tank +import ru.otus.cars.fuel.TankMouth +import ru.otus.cars.fuel.VazTank import kotlin.random.Random /** @@ -18,9 +21,18 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) { } } + private fun getTank() : Tank { + val tank = VazTank() + val tankMouth = TankMouth.PetrolTankMouth(tank) + tank.mouth = tankMouth + return tank + } + override fun build(plates: Car.Plates): Vaz2108 = Vaz2108("Красный").apply { this.engine = getRandomEngine() this.plates = plates + this.tank = getTank() + this.tankMouth = this.tank.mouth } fun alignWheels(vaz2108: Vaz2108) { @@ -38,6 +50,12 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) { override lateinit var engine: VazEngine private set + override lateinit var tank: Tank + private set + + override lateinit var tankMouth: TankMouth + private set + /** * Восьмерка едет так */ @@ -78,5 +96,9 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) { override fun getCurrentSpeed(): Int { return this@Vaz2108.currentSpeed } + + override fun getFuelContents(): Int { + return this@Vaz2108.tank.getContents() + } } } \ 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..393a323 100644 --- a/src/main/kotlin/ru/otus/cars/VazPlatform.kt +++ b/src/main/kotlin/ru/otus/cars/VazPlatform.kt @@ -1,5 +1,7 @@ package ru.otus.cars +import ru.otus.cars.fuel.Tank + abstract class VazPlatform(override val color: String) : Car { // Положение руля. Доступно только внутри класса и наследникам protected var wheelAngle: Int = 0 // Положение руля @@ -14,6 +16,8 @@ abstract class VazPlatform(override val color: String) : Car { // Абстрактное свойство двигателя abstract val engine: VazEngine + + abstract val tank: Tank } // Перечисление двигателей ВАЗ diff --git a/src/main/kotlin/ru/otus/cars/fuel/Tank.kt b/src/main/kotlin/ru/otus/cars/fuel/Tank.kt new file mode 100644 index 0000000..6a823ad --- /dev/null +++ b/src/main/kotlin/ru/otus/cars/fuel/Tank.kt @@ -0,0 +1,8 @@ +package ru.otus.cars.fuel + +interface Tank { + val mouth: TankMouth + fun getContents(): Int + fun receiveFuel(liters: Int) +} + diff --git a/src/main/kotlin/ru/otus/cars/fuel/TankMouth.kt b/src/main/kotlin/ru/otus/cars/fuel/TankMouth.kt new file mode 100644 index 0000000..55491d9 --- /dev/null +++ b/src/main/kotlin/ru/otus/cars/fuel/TankMouth.kt @@ -0,0 +1,19 @@ +package ru.otus.cars.fuel + +sealed class TankMouth(private val tank: Tank) { + fun open() { + println("Горловина открыта") + } + + fun close() { + println("Горловина закрыта") + } + + fun fill(liters: Int) { + tank.receiveFuel(liters) + } + + class LpgTankMouth(tank: Tank) : TankMouth(tank) + class PetrolTankMouth(tank: Tank) : TankMouth(tank) +} + diff --git a/src/main/kotlin/ru/otus/cars/fuel/VazTank.kt b/src/main/kotlin/ru/otus/cars/fuel/VazTank.kt new file mode 100644 index 0000000..3b2986b --- /dev/null +++ b/src/main/kotlin/ru/otus/cars/fuel/VazTank.kt @@ -0,0 +1,14 @@ +package ru.otus.cars.fuel + +class VazTank : Tank { + override lateinit var mouth: TankMouth + + private var fuelAmount: Int = 0 + + override fun getContents(): Int = fuelAmount + + override fun receiveFuel(liters: Int) { + fuelAmount += liters + } + +} \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/gasstation/GasStation.kt b/src/main/kotlin/ru/otus/cars/gasstation/GasStation.kt new file mode 100644 index 0000000..a97ccc6 --- /dev/null +++ b/src/main/kotlin/ru/otus/cars/gasstation/GasStation.kt @@ -0,0 +1,31 @@ +package ru.otus.cars.gasstation + +import ru.otus.cars.Car +import ru.otus.cars.fuel.TankMouth + +class GasStation { + fun fillUpCar(car: Car, liters: Int){ + try { + when(car.tankMouth){ + is TankMouth.LpgTankMouth -> fillWithLpg(car, liters) + is TankMouth.PetrolTankMouth -> fillWithPetrol(car, liters) + } + } catch (e: Error) { + println("Что-то пошло не там при заправке: ${e.message}") + } + } + + private fun fillWithLpg(car: Car, liters: Int) { + car.tankMouth.open() + car.tankMouth.fill(liters) + car.tankMouth.close() + println("Заправил $liters газа") + } + + private fun fillWithPetrol(car: Car, liters: Int) { + car.tankMouth.open() + car.tankMouth.fill(liters) + car.tankMouth.close() + println("Заправил $liters бензина") + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/main.kt b/src/main/kotlin/ru/otus/cars/main.kt index 978d0ef..1649670 100644 --- a/src/main/kotlin/ru/otus/cars/main.kt +++ b/src/main/kotlin/ru/otus/cars/main.kt @@ -1,6 +1,10 @@ package ru.otus.cars +import ru.otus.cars.gasstation.GasStation + fun main() { + println("\n===> refueling") + refueling() println("\n===> drive cars...") driveCars() println("\n===> inner test...") @@ -90,4 +94,31 @@ fun repairEngine(car: VazPlatform) { is VazEngine.LADA_2107 -> println("Чистка карбюратора у двигателя объемом ${car.engine.volume} куб.см у машины $car") is VazEngine.SAMARA_2108 -> println("Угол зажигания у двигателя объемом ${car.engine.volume} куб.см у машины $car") } +} + +fun refueling() { + val vaz2107 = Vaz2107.build(Car.Plates("123", 77)) + val vaz2108 = Vaz2108.build(Car.Plates("321", 78)) + val taz = Taz + + println("Fuel level of VAZ2107: ${vaz2107.VazOutput().getFuelContents()}") + println("Fuel level of VAZ2108: ${vaz2108.VazOutput().getFuelContents()}") + try { + println("Fuel level of TAZ: ${taz.carOutput.getFuelContents()}") + } catch (e: Error) { + println("Can't get TAZ's fuel level: ${e.message}") + } + + val gasStation = GasStation() + gasStation.fillUpCar(vaz2107, 60) + gasStation.fillUpCar(vaz2108, 40) + gasStation.fillUpCar(taz, 10) + + println("Fuel level of VAZ2107: ${vaz2107.VazOutput().getFuelContents()}") + println("Fuel level of VAZ2108: ${vaz2108.VazOutput().getFuelContents()}") + try { + println("Fuel level of TAZ: ${taz.carOutput.getFuelContents()}") + } catch (e: Error) { + println("Can't get TAZ's fuel level: ${e.message}") + } } \ No newline at end of file