Skip to content

Homework for Kotlin-5 #46

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/main/kotlin/ru/otus/cars/Car.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,9 @@ interface Car : CarInput {
* Внутренний статический класс - номерой знак
*/
data class Plates(val number: String, val region: Int)

/**
* горловина TankMouth
*/
var tankMouth: TankMouth
}
6 changes: 6 additions & 0 deletions src/main/kotlin/ru/otus/cars/CarOutput.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,10 @@ interface CarOutput {
* Скажи текущую скорость
*/
fun getCurrentSpeed(): Int

/**
* уровень топлива
*/
fun getFuelContents(): String

}
24 changes: 24 additions & 0 deletions src/main/kotlin/ru/otus/cars/GasStation.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package ru.otus.cars

class GasStation {

fun addFuel(car: Car, liters: Int) {

val mouth = car.tankMouth

when (mouth) {
is PetrolMouth -> mouth.fuelPetrol(liters)
is LpgMouth -> mouth.fuelLpg(liters)
}

}

fun safeAddFuel(car: Car, liters: Int) {
try {
addFuel(car, liters)
} catch (e: NotImplementedError) {
println("Взорвался бак")
}
}

}
62 changes: 62 additions & 0 deletions src/main/kotlin/ru/otus/cars/Tank.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package ru.otus.cars

interface Tank {

var fuelValue: Int

fun getContents(): String

fun receiveFuel(liters: Int) {
fuelValue += liters
}

}

enum class FuelType(val type: String) {
PETROL("Бензин"),
LPG("Газ")
}

abstract class TankMouth(val fuelType: FuelType) : Tank {

override var fuelValue: Int = 0
private var mouthOpen = false

override fun getContents(): String {
return "Тип топлива: ${fuelType.type}, уровень $fuelValue"
}

fun open() {
mouthOpen = true

}

fun close() {
mouthOpen = false
}
}

class PetrolMouth : TankMouth(FuelType.PETROL) {

fun fuelPetrol(liters: Int) {
open()
println("Заправка начинается")
receiveFuel(liters)
println("Заправка окончена")
close()
}

}

class LpgMouth : TankMouth(FuelType.LPG) {

fun fuelLpg(liters: Int) {
open()
println("Начинается заправка")
receiveFuel(liters)
println("Заправка окончена")
close()
}

}

5 changes: 5 additions & 0 deletions src/main/kotlin/ru/otus/cars/Taz.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package ru.otus.cars

object Taz: Car {

override var tankMouth: TankMouth
get() = throw NotImplementedError("Взрыв")
set(value) {}

/**
* Номерной знак
*/
Expand Down
9 changes: 8 additions & 1 deletion src/main/kotlin/ru/otus/cars/Vaz2107.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
override fun build(plates: Car.Plates): Vaz2107 = Vaz2107("Зеленый").apply {
this.engine = getRandomEngine()
this.plates = plates
this.tankMouth = LpgMouth()
}

/**
Expand Down Expand Up @@ -59,20 +60,26 @@ 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, fuelValue=${this.tankMouth.fuelValue})"
}

/**
* Делегируем приборы внутреннему классу
*/
override val carOutput: CarOutput = VazOutput()

override lateinit var tankMouth: TankMouth

/**
* Имеет доступ к внутренним данным ЭТОГО ВАЗ-2107!
*/
inner class VazOutput : CarOutput {
override fun getCurrentSpeed(): Int {
return [email protected]
}

override fun getFuelContents(): String {
return [email protected]()
}
}
}
8 changes: 7 additions & 1 deletion src/main/kotlin/ru/otus/cars/Vaz2108.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ 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 = PetrolMouth()
}

fun alignWheels(vaz2108: Vaz2108) {
Expand Down Expand Up @@ -63,20 +64,25 @@ 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, fuelValue=${this.tankMouth.fuelValue})"
}

/**
* Делегируем приборы внутреннему классу
*/
override val carOutput: CarOutput = VazOutput()

override lateinit var tankMouth: TankMouth

/**
* Имеет доступ к внутренним данным ЭТОГО ВАЗ-2108!
*/
inner class VazOutput : CarOutput {
override fun getCurrentSpeed(): Int {
return [email protected]
}
override fun getFuelContents(): String {
return [email protected]()
}
}
}
17 changes: 17 additions & 0 deletions src/main/kotlin/ru/otus/cars/main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,25 @@ fun main() {
techChecks()
println("\n===> Taz...")
println(Taz.color)
gasValue()
}

fun gasValue() {
val gasStation = GasStation()
val vaz2107 = Vaz2107.build(Car.Plates("123", 77))
val vaz2108 = Vaz2108.build(Car.Plates("321", 78))
val taz = Taz
val carsList = listOf(vaz2107, vaz2108, taz)

carsList.forEach{
val addLiters = 50
println("Характеристики до заправки $it")
gasStation.safeAddFuel(it, addLiters)
println("Характеристики после заправки $it")
}
}


fun driveCars() {
val vaz1 = Togliatti.buildCar(Vaz2107, Car.Plates("123", 77))
val vaz2 = Togliatti.buildCar(Vaz2108, Car.Plates("321", 78))
Expand Down