diff --git a/src/main/kotlin/ru/otus/cars/Car.kt b/src/main/kotlin/ru/otus/cars/Car.kt index 559978c..64e98cc 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/CarOutput.kt b/src/main/kotlin/ru/otus/cars/CarOutput.kt index 875339f..225c109 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 getFuelContents(): Int } \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/Fuel.kt b/src/main/kotlin/ru/otus/cars/Fuel.kt new file mode 100644 index 0000000..0984270 --- /dev/null +++ b/src/main/kotlin/ru/otus/cars/Fuel.kt @@ -0,0 +1,5 @@ +package ru.otus.cars + +enum class Fuel { + Petrol, Lpg +} \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/cars/GasStation.kt b/src/main/kotlin/ru/otus/cars/GasStation.kt new file mode 100644 index 0000000..8126dcf --- /dev/null +++ b/src/main/kotlin/ru/otus/cars/GasStation.kt @@ -0,0 +1,29 @@ +package ru.otus.cars + +class GasStation { + fun refuelCar(car: Car, liters: Int){ + try{ + when(car.tankMouth.typeFuel){ + Fuel.Petrol -> refuelingPetrol(car,liters) + Fuel.Lpg -> refuelingLpg(car,liters) + } + } + catch (e: Exception){ + println("Заправка неуспешная: $e") + } + } + + private fun refuelingPetrol(car: Car, liters: Int){ + println("Начать заправку машины $car бензином $liters л.") + car.tankMouth.open() + car.tankMouth.refuelTank(liters) + car.tankMouth.close() + } + + private fun refuelingLpg(car: Car, liters: Int){ + println("Начать заправку машины $car газом $liters л.") + car.tankMouth.open() + car.tankMouth.refuelTank(liters) + car.tankMouth.close() + } +} \ 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..ab42ad0 --- /dev/null +++ b/src/main/kotlin/ru/otus/cars/Tank.kt @@ -0,0 +1,31 @@ +package ru.otus.cars + +interface Tank { + /** + * Количество топлива + */ + val amountFuel: Int + + /** + * Получить уровень топлива + */ + fun getContents(): Int + + /** + * Заполнить топливо + */ + fun receiveFuel(liters: Int) +} + +open class CarTank() : Tank { + override var amountFuel = 0 + + override fun getContents(): Int { + return amountFuel + } + + override fun receiveFuel(liters: Int){ + amountFuel += liters + } +} + 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..c7a0474 --- /dev/null +++ b/src/main/kotlin/ru/otus/cars/TankMouth.kt @@ -0,0 +1,58 @@ +package ru.otus.cars + +/** + * Горловина бака + */ +abstract class TankMouth(protected val tank: Tank, val typeFuel: Fuel) { + protected var openFlag: Boolean = false + + fun open() { + if (openFlag){ + println("Горловина бака уже открыта") + } else { + openFlag = true + println("Горловина бака открыта") + } + } + + fun close() { + if (openFlag){ + openFlag = false + println("Горловина бака закрыта") + } else { + println("Горловина бака уже закрыта") + } + } + + fun getContents(): Int { + return tank.getContents() + } + + abstract fun refuelTank(amount: Int) + + override fun toString(): String { + return "Горловина бака для топлива вида: $typeFuel" + } +} + + +class MouthPetrol(tank: Tank) : TankMouth(tank, Fuel.Petrol){ + override fun refuelTank(amount: Int){ + if (openFlag){ + println("Заправка $typeFuel : $amount л.") + tank.receiveFuel(amount) + } else { + println("Откройте бак перез заправкой") + } + } +} +class MouthLpg(tank: Tank) : TankMouth(tank, Fuel.Lpg){ + override fun refuelTank(amount: Int) { + if (openFlag){ + println("Заправка $typeFuel : $amount л.") + tank.receiveFuel(amount) + } else { + println("Откройте бак перез заправкой") + } + } +} diff --git a/src/main/kotlin/ru/otus/cars/Taz.kt b/src/main/kotlin/ru/otus/cars/Taz.kt index 49df937..4cc2c79 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 kotlin.random.Random + object Taz: Car { /** * Номерной знак @@ -18,6 +20,17 @@ object Taz: Car { override val carOutput: CarOutput get() = throw NotImplementedError("Приборов нет") + val tank: Tank = TazTank() + + private fun getRandomTankMouth(): TankMouth { + return when (Random.nextInt(0, 2)) { + 0 -> MouthLpg(tank) + else -> MouthPetrol(tank) + } + } + + override val tankMouth: TankMouth = getRandomTankMouth() + /** * Получить оборудование */ @@ -36,4 +49,10 @@ object Taz: Car { override fun wheelToLeft(degrees: Int) { throw NotImplementedError("Руля нет") } +} + +class TazTank(): CarTank(){ + override fun receiveFuel(liters: Int){ + throw Exception("При заправке происходит взрыв бака") + } } \ 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..76aaa7f 100644 --- a/src/main/kotlin/ru/otus/cars/Vaz2107.kt +++ b/src/main/kotlin/ru/otus/cars/Vaz2107.kt @@ -1,5 +1,6 @@ package ru.otus.cars +import ru.otus.cars.Vaz2108.Companion import kotlin.random.Random /** @@ -18,8 +19,11 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { } override fun build(plates: Car.Plates): Vaz2107 = Vaz2107("Зеленый").apply { + val tank = CarTank() this.engine = getRandomEngine() this.plates = plates + this.tankMouth = MouthLpg(tank) + this.carOutput = VazOutput(tank) } /** @@ -65,14 +69,21 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { /** * Делегируем приборы внутреннему классу */ - override val carOutput: CarOutput = VazOutput() + override lateinit var carOutput: CarOutput + + override lateinit var tankMouth: TankMouth /** * Имеет доступ к внутренним данным ЭТОГО ВАЗ-2107! */ - inner class VazOutput : CarOutput { + inner class VazOutput(val tank: Tank) : CarOutput { + override fun getCurrentSpeed(): Int { return this@Vaz2107.currentSpeed } + + override fun getFuelContents(): Int { + return 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..a7281d2 100644 --- a/src/main/kotlin/ru/otus/cars/Vaz2108.kt +++ b/src/main/kotlin/ru/otus/cars/Vaz2108.kt @@ -19,8 +19,11 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) { } override fun build(plates: Car.Plates): Vaz2108 = Vaz2108("Красный").apply { + val tank = CarTank() this.engine = getRandomEngine() this.plates = plates + this.tankMouth = MouthPetrol(tank) + this.carOutput = VazOutput(tank) } fun alignWheels(vaz2108: Vaz2108) { @@ -69,14 +72,20 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) { /** * Делегируем приборы внутреннему классу */ - override val carOutput: CarOutput = VazOutput() + override lateinit var carOutput: CarOutput + + override lateinit var tankMouth: TankMouth /** * Имеет доступ к внутренним данным ЭТОГО ВАЗ-2108! */ - inner class VazOutput : CarOutput { + inner class VazOutput(val tank: Tank) : CarOutput { override fun getCurrentSpeed(): Int { return this@Vaz2108.currentSpeed } + + override fun getFuelContents(): Int { + return 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..60d4e8f 100644 --- a/src/main/kotlin/ru/otus/cars/VazPlatform.kt +++ b/src/main/kotlin/ru/otus/cars/VazPlatform.kt @@ -23,4 +23,4 @@ sealed class VazEngine { data class LADA_2107(override val volume: Int) : VazEngine() data class SAMARA_2108(override val volume: Int) : VazEngine() -} \ 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..627d13a 100644 --- a/src/main/kotlin/ru/otus/cars/main.kt +++ b/src/main/kotlin/ru/otus/cars/main.kt @@ -16,6 +16,10 @@ fun main() { techChecks() println("\n===> Taz...") println(Taz.color) + + println("\n===> refuel car...") + refuelCar() + } fun driveCars() { @@ -31,7 +35,7 @@ fun driveCars() { fun innerNestedCheck() { val vaz = Vaz2107.build(Car.Plates("123", 77)) - val output = vaz.VazOutput() // Создаем новый объект ИЗ ЭКЗЕМПЛЯРА МАШИНЫ + val output = vaz.carOutput // Создаем новый объект ИЗ ЭКЗЕМПЛЯРА МАШИНЫ println("Скорость до проверки: ${output.getCurrentSpeed()}") // Выводит 0 Vaz2107.test(vaz) // Газуем... @@ -90,4 +94,28 @@ fun repairEngine(car: VazPlatform) { is VazEngine.LADA_2107 -> println("Чистка карбюратора у двигателя объемом ${car.engine.volume} куб.см у машины $car") is VazEngine.SAMARA_2108 -> println("Угол зажигания у двигателя объемом ${car.engine.volume} куб.см у машины $car") } +} + +fun refuelCar(){ + val cars = listOf( + Vaz2107.build(Car.Plates("123", 45)), + Vaz2108.build(Car.Plates("456", 72)), + Taz + ) + + val gasStation = GasStation() + + cars.forEach{ + println("Машина $it , ${it.tankMouth} , бак содержит ${it.tankMouth.getContents()} л.") + } + + cars.forEach{ + println("-------------------------------------") + gasStation.refuelCar(it, 5) + println("-------------------------------------") + } + + cars.forEach{ + println("Машина $it , ${it.tankMouth} , бак содержит ${it.tankMouth.getContents()} л.") + } } \ No newline at end of file