diff --git a/src/main/kotlin/ru/otus/cars/Car.kt b/src/main/kotlin/ru/otus/cars/Car.kt index 559978c..3b28e3a 100644 --- a/src/main/kotlin/ru/otus/cars/Car.kt +++ b/src/main/kotlin/ru/otus/cars/Car.kt @@ -1,9 +1,14 @@ package ru.otus.cars + /** * Машина целиком */ interface Car : CarInput { + var fuelLevel: Int + var tankMouth: TankMouth + val MODEL: String + /** * Номерной знак */ @@ -28,4 +33,4 @@ interface Car : CarInput { * Внутренний статический класс - номерой знак */ data class Plates(val number: String, val region: Int) -} \ No newline at end of file +} diff --git a/src/main/kotlin/ru/otus/cars/CarBuilder.kt b/src/main/kotlin/ru/otus/cars/CarBuilder.kt index 224f46d..9d03cd7 100644 --- a/src/main/kotlin/ru/otus/cars/CarBuilder.kt +++ b/src/main/kotlin/ru/otus/cars/CarBuilder.kt @@ -1,5 +1,7 @@ package ru.otus.cars +import kotlin.random.Random + /** * Сборщик машины */ @@ -8,4 +10,27 @@ sealed interface CarBuilder { * Собери машину */ fun build(plates: Car.Plates): Car + + object Tank { + fun getContents(car: Car): Int { + return car.fuelLevel + } + + fun receiveFuel(car: Car, liters: Int) { + car.fuelLevel += liters + } + } + + +} + +enum class TankMouth(val typeOfFuel: String) { + LADA_2107("Lpg"), + SAMARA_2108("Petrol"), + Taz( + when (Random.nextInt(0, 2)) { + 1 -> "Lpg" + else -> "Petrol" + } + ) } \ 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..acbece4 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/Taz.kt b/src/main/kotlin/ru/otus/cars/Taz.kt index 49df937..48f6f32 100644 --- a/src/main/kotlin/ru/otus/cars/Taz.kt +++ b/src/main/kotlin/ru/otus/cars/Taz.kt @@ -1,6 +1,11 @@ package ru.otus.cars -object Taz: Car { +object Taz : Car { + override var fuelLevel: Int = 10 + set(value) = throw NotImplementedError("Взрыв бензобака") + override var tankMouth: TankMouth = TankMouth.Taz + override val MODEL = "Taz" + /** * Номерной знак */ @@ -36,4 +41,6 @@ object Taz: Car { override fun wheelToLeft(degrees: Int) { 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..ca085aa 100644 --- a/src/main/kotlin/ru/otus/cars/Vaz2107.kt +++ b/src/main/kotlin/ru/otus/cars/Vaz2107.kt @@ -6,6 +6,9 @@ import kotlin.random.Random * Семёрочка */ class Vaz2107 private constructor(color: String) : VazPlatform(color) { + override val MODEL: String = "Vaz2107" + override var tankMouth: TankMouth= TankMouth.LADA_2107 + /** * Сам-себе-сборщик ВАЗ 2107. */ @@ -59,7 +62,8 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { // Выводим состояние машины override fun toString(): String { - return "Vaz2107(plates=$plates, wheelAngle=$wheelAngle, currentSpeed=$currentSpeed)" + return "Vaz2107(plates=$plates, wheelAngle=$wheelAngle, " + + "currentSpeed=$currentSpeed, fuel level=${carOutput.getFuelContents()})" } /** @@ -74,5 +78,9 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) { override fun getCurrentSpeed(): Int { return this@Vaz2107.currentSpeed } + + override fun getFuelContents(): Int { + return CarBuilder.Tank.getContents(this@Vaz2107) + } } } \ 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..8ddb705 100644 --- a/src/main/kotlin/ru/otus/cars/Vaz2108.kt +++ b/src/main/kotlin/ru/otus/cars/Vaz2108.kt @@ -5,7 +5,10 @@ import kotlin.random.Random /** * Восьмерка */ -class Vaz2108 private constructor(color: String) : VazPlatform(color) { +class Vaz2108 private constructor(color: String) : VazPlatform(color), Car { + override val MODEL: String = "Vaz2108" + override var tankMouth: TankMouth = TankMouth.SAMARA_2108 + /** * Сам-себе-сборщик ВАЗ 2108. */ @@ -38,6 +41,7 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) { override lateinit var engine: VazEngine private set + /** * Восьмерка едет так */ @@ -63,7 +67,8 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) { // Выводим состояние машины override fun toString(): String { - return "Vaz2108(plates=$plates, wheelAngle=$wheelAngle, currentSpeed=$currentSpeed)" + return "Vaz2108(plates=$plates, wheelAngle=$wheelAngle, " + + "currentSpeed=$currentSpeed, fuel level=${carOutput.getFuelContents()})" } /** @@ -78,5 +83,13 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) { override fun getCurrentSpeed(): Int { return this@Vaz2108.currentSpeed } + + override fun getFuelContents(): Int { + return CarBuilder.Tank.getContents(this@Vaz2108) + } } -} \ 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..2562d90 100644 --- a/src/main/kotlin/ru/otus/cars/VazPlatform.kt +++ b/src/main/kotlin/ru/otus/cars/VazPlatform.kt @@ -1,19 +1,27 @@ package ru.otus.cars + abstract class VazPlatform(override val color: String) : Car { // Положение руля. Доступно только внутри класса и наследникам protected var wheelAngle: Int = 0 // Положение руля // Реализация интерфейса CarInput - override fun wheelToRight(degrees: Int) { wheelAngle += degrees } + override fun wheelToRight(degrees: Int) { + wheelAngle += degrees + } + // Реализация интерфейса CarInput - override fun wheelToLeft(degrees: Int) { wheelAngle -= degrees } + override fun wheelToLeft(degrees: Int) { + wheelAngle -= degrees + } // Получить оборудование override fun getEquipment(): String = "Кузов, колеса, движок" // Абстрактное свойство двигателя abstract val engine: VazEngine + + override var fuelLevel: Int = 10 } // Перечисление двигателей ВАЗ @@ -23,4 +31,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..a38a9a3 100644 --- a/src/main/kotlin/ru/otus/cars/main.kt +++ b/src/main/kotlin/ru/otus/cars/main.kt @@ -1,5 +1,6 @@ package ru.otus.cars + fun main() { println("\n===> drive cars...") driveCars() @@ -16,6 +17,9 @@ fun main() { techChecks() println("\n===> Taz...") println(Taz.color) + println("\n===> refuel...") + reFuel(Taz, 5) + reFuelCars() } fun driveCars() { @@ -36,6 +40,7 @@ fun innerNestedCheck() { println("Скорость до проверки: ${output.getCurrentSpeed()}") // Выводит 0 Vaz2107.test(vaz) // Газуем... println("Скорость после проверки: ${output.getCurrentSpeed()}") // Выводит случайную скорость + println("Уровень топлива: ${output.getFuelContents()}") //Ввыводит уровень топлива } fun garageMake() { @@ -90,4 +95,44 @@ fun repairEngine(car: VazPlatform) { is VazEngine.LADA_2107 -> println("Чистка карбюратора у двигателя объемом ${car.engine.volume} куб.см у машины $car") is VazEngine.SAMARA_2108 -> println("Угол зажигания у двигателя объемом ${car.engine.volume} куб.см у машины $car") } -} \ No newline at end of file +} + +/** + * Заправка топливом + */ +fun reFuel(car: Car, liters: Int) { + println() + println(car.MODEL) + println(car.tankMouth.typeOfFuel) + try { + println("Уровень топлива до заправки= ${car.carOutput.getFuelContents()}") + when (car.tankMouth.typeOfFuel) { + "Petrol" -> fuelPetrol(car, liters) + "Lpg" -> fuelLpg(car, liters) + } + println("Заправляем топливо: ${car.tankMouth.typeOfFuel}") + println("Уровень топлива после заправки= ${car.carOutput.getFuelContents()}") + } catch (e: Error) { + println("Бак взорвался") + } +} + +fun fuelPetrol(car: Car, liters: Int) { + CarBuilder.Tank.receiveFuel(car, liters) +} + +fun fuelLpg(car: Car, liters: Int) { + CarBuilder.Tank.receiveFuel(car, liters) +} + +fun reFuelCars() { + val cars = listOf( + Vaz2107.build(Car.Plates("123", 77)), + Vaz2108.build(Car.Plates("321", 78)), + ) + cars.forEach { car -> + reFuel(car, 20) + println("Автомобиль: ${car.MODEL} состояние:${car.toString()}") + } +} +