Skip to content

create homework #36

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 @@ -14,6 +14,11 @@ interface Car : CarInput {
*/
val color: String

/**
* Бак
* */
val tank: Tank

/**
* Следит за машиной
*/
Expand Down
2 changes: 2 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,6 @@ interface CarOutput {
* Скажи текущую скорость
*/
fun getCurrentSpeed(): Int

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

class GasStation {

companion object {
fun refuelCar(car: Car, litres: Int) {
println("Заправляем ${car.javaClass.simpleName}")
try {
when (car.tank.tankMouth) {
is LpgMouth -> refuelLpg(car.tank, litres)

is PetrolMouth -> refuelPetrol(car.tank, litres)
}
} catch (e: NotImplementedError) {
println("Не повезло. ${e.message}")
}
}
private fun refuelLpg(tank: Tank, litres: Int) {
println("Заправляем газом")
tank.receiveFuel(litres)
}

private fun refuelPetrol(tank: Tank, litres: Int) {
println("Заправляем бензином")
tank.receiveFuel(litres)
}
}
}
3 changes: 3 additions & 0 deletions src/main/kotlin/ru/otus/cars/LpgMouth.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package ru.otus.cars

class LpgMouth : TankMouth()
3 changes: 3 additions & 0 deletions src/main/kotlin/ru/otus/cars/PetrolMouth.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package ru.otus.cars

class PetrolMouth : TankMouth()
22 changes: 22 additions & 0 deletions src/main/kotlin/ru/otus/cars/Tank.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ru.otus.cars


/**
* Бак
* */
interface Tank {
/**
* Горловина
* */
val tankMouth: TankMouth

/**
* Показать содержимое
* */
fun getContents():Int

/**
* Заправить
* */
fun receiveFuel(litres: Int)
}
11 changes: 11 additions & 0 deletions src/main/kotlin/ru/otus/cars/TankMouth.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ru.otus.cars

abstract class TankMouth {
fun open() {
println("Горловина открыта")
}

fun close() {
println("Горловина закрыта")
}
}
2 changes: 2 additions & 0 deletions src/main/kotlin/ru/otus/cars/Taz.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ object Taz: Car {
* Цвет машины
*/
override val color: String = "Ржавый"
override val tank: Tank
get() = throw NotImplementedError("Нельзя заправить. Машина взорвалась!!!")

/**
* Следит за машиной
Expand Down
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 @@ -17,9 +17,17 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
}
}

private fun getRandomTank(): VasTank {
return when (Random.nextInt(0, 2)) {
0 -> VasTank.Petrol(PetrolMouth())
else -> VasTank.Lpg(LpgMouth())
}
}

override fun build(plates: Car.Plates): Vaz2107 = Vaz2107("Зеленый").apply {
this.engine = getRandomEngine()
this.plates = plates
this.tank = getRandomTank()
}

/**
Expand All @@ -39,6 +47,8 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
// Переопределяем свойство родителя
override lateinit var engine: VazEngine
private set
override lateinit var tank: Tank
private set

/**
* Семерка едет так
Expand Down Expand Up @@ -74,5 +84,9 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
override fun getCurrentSpeed(): Int {
return [email protected]
}

override fun getFuelContents(): Int {
return tank.getContents()
}
}
}
14 changes: 14 additions & 0 deletions src/main/kotlin/ru/otus/cars/Vaz2108.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,17 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) {
}
}

private fun getRandomTank(): VasTank {
return when (Random.nextInt(0, 2)) {
0 -> VasTank.Petrol(PetrolMouth())
else -> VasTank.Lpg(LpgMouth())
}
}

override fun build(plates: Car.Plates): Vaz2108 = Vaz2108("Красный").apply {
this.engine = getRandomEngine()
this.plates = plates
this.tank = getRandomTank()
}

fun alignWheels(vaz2108: Vaz2108) {
Expand All @@ -37,6 +45,8 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) {
// Переопределяем свойство родителя
override lateinit var engine: VazEngine
private set
override lateinit var tank: Tank
private set

/**
* Восьмерка едет так
Expand Down Expand Up @@ -78,5 +88,9 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) {
override fun getCurrentSpeed(): Int {
return [email protected]
}

override fun getFuelContents(): Int {
return tank.getContents()
}
}
}
49 changes: 47 additions & 2 deletions src/main/kotlin/ru/otus/cars/VazPlatform.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,23 @@ 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

abstract override val tank: Tank

}

// Перечисление двигателей ВАЗ
Expand All @@ -23,4 +31,41 @@ sealed class VazEngine {

data class LADA_2107(override val volume: Int) : VazEngine()
data class SAMARA_2108(override val volume: Int) : VazEngine()
}

/**
* Реализция бака
* */
sealed class VasTank : Tank {

/**
* Уровень горючего
* */
private var fuelLevel: Int = 0
set(value) {
if (value <= 30) {
field = value
} else {
field = 30
println("Бак под завязку")
}
}

override fun getContents(): Int {
return fuelLevel
}

override fun receiveFuel(litres: Int) {
tankMouth.open()
this.fuelLevel = litres
tankMouth.close()
}

override fun toString(): String {
return "${tankMouth.javaClass} (fuelLevel=$fuelLevel)"
}

data class Petrol(override val tankMouth: TankMouth) : VasTank()
data class Lpg(override val tankMouth: TankMouth) : VasTank()

}
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,6 +16,8 @@ fun main() {
techChecks()
println("\n===> Taz...")
println(Taz.color)
println("\n===> refuel car...")
refuelCar()
}

fun driveCars() {
Expand Down Expand Up @@ -90,4 +92,19 @@ 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 vaz1 = Togliatti.buildCar(Vaz2107, Car.Plates("123", 77))
val vaz2 = Togliatti.buildCar(Vaz2108, Car.Plates("321", 78))

println("Содержимое бака ${vaz1.javaClass.simpleName} = ${vaz1.carOutput.getFuelContents()}")
GasStation.refuelCar(vaz1, 20)
println("Содержимое бака ${vaz1.javaClass.simpleName} после заправки = ${vaz1.carOutput.getFuelContents()}")
println()
println("Содержимое бака ${vaz2.javaClass.simpleName} = ${vaz2.carOutput.getFuelContents()}")
GasStation.refuelCar(vaz2,47)
println("Содержимое бака ${vaz2.javaClass.simpleName} после заправки = ${vaz2.carOutput.getFuelContents()}")
println()
GasStation.refuelCar(Taz, 1500)
}