diff --git a/src/main/kotlin/ru/otus/cars/Car.kt b/src/main/kotlin/ru/otus/cars/Car.kt index 559978c..9d1f4dc 100644 --- a/src/main/kotlin/ru/otus/cars/Car.kt +++ b/src/main/kotlin/ru/otus/cars/Car.kt @@ -19,6 +19,10 @@ interface Car : CarInput { */ val carOutput: CarOutput + val tank: Tank + val tankMouth: TankMouth + + /** * Получить оборудование */ 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/FuelStation.kt b/src/main/kotlin/ru/otus/cars/FuelStation.kt new file mode 100644 index 0000000..c799ca7 --- /dev/null +++ b/src/main/kotlin/ru/otus/cars/FuelStation.kt @@ -0,0 +1,22 @@ +package ru.otus.cars + +class FuelStation { + fun carRefuel(car: Car, liters: Int){ + val tankMouth = car.tankMouth + try { + if (tankMouth is TankMouth.PetrolMouth){ + (tankMouth as TankMouth.PetrolMouth).fuelPetrol(liters) + } else { + (tankMouth as TankMouth.LpgMouth).fuelLpg(liters) + } + } catch (e: Exception){ + println(e.toString()) + } + } + + fun carsRefuel(cars: List){ + cars.forEach({ it.tank.getContents() }) + cars.forEach({ carRefuel(it, 50) }) + cars.forEach({ it.tank.getContents() }) + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/FuelType.kt b/src/main/kotlin/ru/otus/cars/FuelType.kt new file mode 100644 index 0000000..4cf96f0 --- /dev/null +++ b/src/main/kotlin/ru/otus/cars/FuelType.kt @@ -0,0 +1,6 @@ +package ru.otus.cars + +enum class FuelType () { + PETROL, + LPG +} \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/Tank.kt b/src/main/kotlin/ru/otus/cars/Tank.kt new file mode 100644 index 0000000..7675ae2 --- /dev/null +++ b/src/main/kotlin/ru/otus/cars/Tank.kt @@ -0,0 +1,15 @@ +package ru.otus.cars + +class Tank() { + + lateinit var mouth: TankMouth + + private var currentFuelLevel: Int = 0 + + fun getContents(): Int{ + return currentFuelLevel + } + fun receiveFuel(liters: Int){ + currentFuelLevel += liters + } +} \ 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..61c67e9 --- /dev/null +++ b/src/main/kotlin/ru/otus/cars/TankMouth.kt @@ -0,0 +1,39 @@ +package ru.otus.cars + +sealed class TankMouth { + + abstract fun open() + abstract fun close() + + class LpgMouth(val tank: Tank): TankMouth(){ + fun fuelLpg(liters: Int){ + open() + tank.receiveFuel(liters) + close() + } + + override fun open() { + println("Горловина бака открыта") + } + + override fun close() { + println("Горловина бака закрыта") + } + } + + class PetrolMouth(val tank: Tank): TankMouth() { + fun fuelPetrol(liters: Int){ + open() + tank.receiveFuel(liters) + close() + } + + override fun open() { + println("Горловина баллона открыта") + } + + override fun close() { + println("Горловина баллона закрыта") + } + } +} \ 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..0297ac1 100644 --- a/src/main/kotlin/ru/otus/cars/Taz.kt +++ b/src/main/kotlin/ru/otus/cars/Taz.kt @@ -7,6 +7,11 @@ object Taz: Car { override val plates: Car.Plates get() = throw NotImplementedError("Номера сняты") + override val tankMouth: TankMouth + get() = throw Exception("Взрыв") + + override val tank: Tank = Tank() + /** * Цвет машины */ diff --git a/src/main/kotlin/ru/otus/cars/Vaz2107.kt b/src/main/kotlin/ru/otus/cars/Vaz2107.kt index be857d2..3b6aa11 100644 --- a/src/main/kotlin/ru/otus/cars/Vaz2107.kt +++ b/src/main/kotlin/ru/otus/cars/Vaz2107.kt @@ -20,8 +20,9 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { override fun build(plates: Car.Plates): Vaz2107 = Vaz2107("Зеленый").apply { this.engine = getRandomEngine() this.plates = plates + this.tank = getTank() + this.tankMouth = tank.mouth } - /** * Проверь, ездит или нет */ @@ -48,7 +49,21 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { println("Др-др-др-др....") } - private var currentSpeed: Int = 0 // Скока жмёт + private var currentSpeed: Int = 0// Скока жмёт + private var fuelType = FuelType.LPG + private fun getTank(): Tank { + val tank = Tank() + val mouth = if (fuelType == FuelType.PETROL){ + TankMouth.PetrolMouth(tank) + } else { + TankMouth.LpgMouth(tank) + } + tank.mouth = mouth + return tank + } + + override lateinit var tank: Tank + override lateinit var tankMouth: TankMouth /** * Доступно сборщику @@ -74,5 +89,11 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { override fun getCurrentSpeed(): Int { return this@Vaz2107.currentSpeed } + + override fun getFuelContents(): Int { + return this@Vaz2107.getTank().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..7d26e38 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.tank = getTank() + this.tankMouth = tank.mouth } fun alignWheels(vaz2108: Vaz2108) { @@ -53,6 +55,20 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) { } private var currentSpeed: Int = 0 // Скока жмёт + private var fuelType = FuelType.PETROL + private fun getTank(): Tank { + val tank = Tank() + val mouth = if (fuelType == FuelType.PETROL){ + TankMouth.PetrolMouth(tank) + } else { + TankMouth.LpgMouth(tank) + } + tank.mouth = mouth + return tank + } + + override lateinit var tank: Tank + override lateinit var tankMouth: TankMouth /** * Доступно сборщику @@ -78,5 +94,9 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) { override fun getCurrentSpeed(): Int { return this@Vaz2108.currentSpeed } + + override fun getFuelContents(): Int { + return this@Vaz2108.getTank().getContents() + } } } \ No newline at end of file