Skip to content

ДЗ Kotlin-5 #55

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 @@ -19,6 +19,11 @@ interface Car : CarInput {
*/
val carOutput: CarOutput

/**
* Топливная система
*/
val tank: Tank

/**
* Получить оборудование
*/
Expand Down
5 changes: 5 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,9 @@ interface CarOutput {
* Скажи текущую скорость
*/
fun getCurrentSpeed(): Int

/**
* Скажи текущую скорость
*/
fun getFuelLevel(): Int
}
38 changes: 38 additions & 0 deletions src/main/kotlin/ru/otus/cars/Tank.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package ru.otus.cars

class PetrolMouth(owner: Tank) : TankMouth(owner){
fun fuelPetrol(liters :Int): Unit {
if (!opened) throw NotImplementedError("Бак закрыт, заправка невозможна")
owner.receiveFuel(liters)
}
}

class LpgMouth(owner: Tank): TankMouth(owner) {
fun fuelLpg(liters :Int): Unit {
if (!opened) throw NotImplementedError("Бак закрыт, заправка невозможна")
owner.receiveFuel(liters)
}
}

abstract class TankMouth(parOwner: Tank) {
val owner = parOwner
var opened : Boolean = false
fun open(): Unit { opened = true }
fun close(): Unit { opened = false }
}

interface Tank {
var capacity : Int
var fuelLevel : Int
var mouth : TankMouth?
fun getContents(): Int {
return fuelLevel
}
fun receiveFuel(liters: Int): Unit {
if (fuelLevel + liters > capacity) {
fuelLevel = capacity
throw NotImplementedError("Превышена емкость топливного бака")
}
fuelLevel += liters
}
}
23 changes: 18 additions & 5 deletions src/main/kotlin/ru/otus/cars/Taz.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package ru.otus.cars

object Taz: Car {
override val tank: Tank = TazTank()
override val carOutput: CarOutput = TazOutput()
/**
* Номерной знак
*/
Expand All @@ -12,11 +14,6 @@ object Taz: Car {
*/
override val color: String = "Ржавый"

/**
* Следит за машиной
*/
override val carOutput: CarOutput
get() = throw NotImplementedError("Приборов нет")

/**
* Получить оборудование
Expand All @@ -36,4 +33,20 @@ object Taz: Car {
override fun wheelToLeft(degrees: Int) {
throw NotImplementedError("Руля нет")
}

class TazOutput : CarOutput {
override fun getCurrentSpeed(): Int {
throw NotImplementedError("Спидометр недоступен")
}

override fun getFuelLevel(): Int {
return tank.getContents()
}
}

class TazTank : Tank {
override var capacity : Int = 0
override var fuelLevel : Int = 0
override var mouth : TankMouth? = PetrolMouth(this)
}
}
14 changes: 14 additions & 0 deletions 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.tank.mouth = LpgMouth(this.tank)
}

/**
Expand All @@ -40,6 +41,7 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
override lateinit var engine: VazEngine
private set


/**
* Семерка едет так
*/
Expand Down Expand Up @@ -67,12 +69,24 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
*/
override val carOutput: CarOutput = VazOutput()

override var tank: Tank = VazTank()

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

override fun getFuelLevel(): Int {
return [email protected]
}
}

inner class VazTank : Tank {
override var capacity : Int = 40
override var fuelLevel : Int = 0
override var mouth : TankMouth? = null
}
}
13 changes: 13 additions & 0 deletions 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.tank.mouth = PetrolMouth(this.tank)
}

fun alignWheels(vaz2108: Vaz2108) {
Expand Down Expand Up @@ -71,12 +72,24 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) {
*/
override val carOutput: CarOutput = VazOutput()

override var tank: Tank = VazTank()

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

override fun getFuelLevel(): Int {
return [email protected]
}
}

inner class VazTank : Tank {
override var capacity : Int = 50
override var fuelLevel : Int = 0
override var mouth : TankMouth? = null
}
}
58 changes: 42 additions & 16 deletions src/main/kotlin/ru/otus/cars/main.kt
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
package ru.otus.cars

import kotlin.random.Random

fun main() {
println("\n===> drive cars...")
driveCars()
println("\n===> inner test...")
innerNestedCheck()
println("\n===> garage make...")
garageMake()
println("\n===> model special...")
println("\n===> get equipment...")
getEquipment()
println("\n===> get color...")
getColor()
println("\n===> tech checks...")
techChecks()
println("\n===> Taz...")
println(Taz.color)
val vaz1 = Togliatti.buildCar(Vaz2107, Car.Plates("123", 77))
val vaz2 = Togliatti.buildCar(Vaz2108, Car.Plates("321", 78))
val gs = GasStation()


println("vaz1: в баке " + vaz1.carOutput.getFuelLevel() + " литров")
println("vaz2: в баке " + vaz2.carOutput.getFuelLevel() + " литров")
println("taz: в баке " + Taz.carOutput.getFuelLevel() + " литров")

gs.car = vaz1
gs.refuelingCar(20)
gs.car = vaz2
gs.refuelingCar(30)
gs.car = Taz
gs.refuelingCar(40)
println("vaz1: в баке " + vaz1.carOutput.getFuelLevel() + " литров")
println("vaz2: в баке " + vaz2.carOutput.getFuelLevel() + " литров")
println("taz: в баке " + Taz.carOutput.getFuelLevel() + " литров")
}

fun driveCars() {
Expand Down Expand Up @@ -90,4 +95,25 @@ fun repairEngine(car: VazPlatform) {
is VazEngine.LADA_2107 -> println("Чистка карбюратора у двигателя объемом ${car.engine.volume} куб.см у машины $car")
is VazEngine.SAMARA_2108 -> println("Угол зажигания у двигателя объемом ${car.engine.volume} куб.см у машины $car")
}
}
}

class GasStation {
var car : Car? = null
fun refuelingCar(liters : Int) : Unit {
try {
if (car != null) {
val mouth = car!!.tank.mouth
if (mouth != null) {
mouth.open()
when (mouth) {
is PetrolMouth -> mouth.fuelPetrol(liters)
is LpgMouth -> mouth.fuelLpg(liters)
}
mouth.close()
}
}
} catch(e : Error) {
println("Ошибка: ${e.message}")
}
}
}