Skip to content

Kotlin #5 Домашнее задание [Крикунов Сергей] #53

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
8 changes: 6 additions & 2 deletions src/main/kotlin/ru/otus/cars/Car.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ interface Car : CarInput {
/**
* Номерной знак
*/
val plates: Plates
// в задании именно CarPlates (никак не Plates)
val plates: CarPlates

/**
* Цвет машины
Expand All @@ -27,5 +28,8 @@ interface Car : CarInput {
/**
* Внутренний статический класс - номерой знак
*/
data class Plates(val number: String, val region: Int)
data class CarPlates(val number: String, val region: Int)

// горловина бака
val tankMouth: TankMouth
}
2 changes: 1 addition & 1 deletion src/main/kotlin/ru/otus/cars/CarBuilder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ sealed interface CarBuilder {
/**
* Собери машину
*/
fun build(plates: Car.Plates): Car
fun build(plates: Car.CarPlates): Car
}
8 changes: 4 additions & 4 deletions src/main/kotlin/ru/otus/cars/CarFactory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ interface CarFactory {
/**
* Выпусти машину
*/
fun buildCar(builder: CarBuilder, plates: Car.Plates): Car
fun buildCar(builder: CarBuilder, plates: Car.CarPlates): Car
}

/**
* Автозавод в Тольятти (он у нас один такой)
*/
object Togliatti : CarFactory {
private fun buildVaz2107(plates: Car.Plates): Car {
private fun buildVaz2107(plates: Car.CarPlates): Car {
println("Запил ${Vaz2107.MODEL} в Тольятти...")
val vaz = Vaz2107.build(plates)
println("Проверяем тачку...")
Expand All @@ -23,7 +23,7 @@ object Togliatti : CarFactory {
return vaz
}

private fun buildVaz2108(plates: Car.Plates): Car {
private fun buildVaz2108(plates: Car.CarPlates): Car {
println("Запил ${Vaz2108.MODEL} в Тольятти...")
val vaz = Vaz2108.build(plates)
println("Сход-развал...")
Expand All @@ -32,7 +32,7 @@ object Togliatti : CarFactory {
return vaz
}

override fun buildCar(builder: CarBuilder, plates: Car.Plates): Car {
override fun buildCar(builder: CarBuilder, plates: Car.CarPlates): Car {
return when (builder) {
is Vaz2107.Companion -> return buildVaz2107(plates)
is Vaz2108.Companion -> return buildVaz2108(plates)
Expand Down
4 changes: 3 additions & 1 deletion src/main/kotlin/ru/otus/cars/CarOutput.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ package ru.otus.cars
/**
* Следит за машиной
*/
interface CarOutput {
interface CarOutput : Tank {
/**
* Скажи текущую скорость
*/
fun getCurrentSpeed(): Int
// Остаток в баке
fun getFuelContents() : Int
}
7 changes: 7 additions & 0 deletions src/main/kotlin/ru/otus/cars/FuelType.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.otus.cars

// Список допустимого топлива
enum class FuelType (val fuelType: String) {
PETROL("Бензин"),
LPG("Сжиженный газ")
}
52 changes: 52 additions & 0 deletions src/main/kotlin/ru/otus/cars/GasStation.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package ru.otus.cars

import ru.otus.cars.Taz.tankMouth
import kotlin.random.Random

// АЗС, заправляет любым топливом
class GasStation {
// заправка машины топливом
fun fuelCar(car: Car) {
// защищенный блок, процесс заправки НЕ должен "взрываться"
try {
println("Топлива до заправки: ${car.carOutput.getFuelContents()}")
when (car.tankMouth.fuelType) {
FuelType.PETROL -> fuelPetrol(car.tankMouth as PetrolMouth, Random.nextInt(0, 100))
FuelType.LPG -> fuelLpg(car.tankMouth as LpgMouth, Random.nextInt(0, 100))
}
println("Топлива после заправки: ${car.carOutput.getFuelContents()}")
} catch (t: Throwable) {
println("Ошибка: ${t.message}")
}

}
// заправка именно бензином, снаружи НЕ доступна
private fun fuelPetrol(tankMouth: PetrolMouth, liters: Int) {
tankMouth.fuelPetrol(liters)
}
// заправка именно сжиженным газом, снаружи НЕ доступна
private fun fuelLpg(tankMouth: LpgMouth, liters: Int) {
tankMouth.fuelLpg(liters)
}

fun showCarsInfo(cars: List<Car>){
cars.forEach { car: Car -> println(car.getEquipment())
}
}

// заправка нескольких машин топливом
fun fuelCars(carList: List<Car>) {
println("")
println("Инфо до заправки")
println("-------------------------------------------------------------------------")
showCarsInfo(cars = carList)
println("-------------------------------------------------------------------------")
println("Заправка")
for(car: Car in carList){
fuelCar(car)
}
println("-------------------------------------------------------------------------")
println("Инфо после заправки")
showCarsInfo(cars = carList)
}
}
9 changes: 9 additions & 0 deletions src/main/kotlin/ru/otus/cars/Tank.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ru.otus.cars

// Бак
interface Tank {
// Остаток в баке
fun getContenst() : Int
// Изменить остаток в баке
fun reciveFuel(liters: Int)
}
64 changes: 64 additions & 0 deletions src/main/kotlin/ru/otus/cars/TankMouth.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package ru.otus.cars

// Топливная система - включает в себя горловину и бак (как наследника бака)
abstract class TankMouth(val value: FuelType): Tank {
init {
println("Тип топливной системы: ${value}")
}
// Допустимый тип топлива
val fuelType: FuelType = value
// Текущий объем топлива (литры)
var currentFuel: Int = 0
// Открыть
fun open() {
println("Горловина открыта")
}
// Закрыть
fun close() {
println("Горловина закрыта")
}
// текущий остаток топлива
override fun getContenst() : Int {
return this.currentFuel
}
// заправка топливом
override fun reciveFuel(liters: Int) {
this.currentFuel += liters
}
}

class CustomException(message: String) : Exception(message)

// Топливная система на бензине
class PetrolMouth : TankMouth(FuelType.PETROL) {
// Заправка бензином
fun fuelPetrol(liters: Int) {
if (fuelType != FuelType.PETROL) {
throw CustomException("Недопустимый тип топлива")
}
// Открыть бак
this.open()
// Заправим бак
this.reciveFuel(liters)
println("заправлено: ${liters}, всего в баке ${this.currentFuel}")
// Закрыть бак
this.close()
}
}

// Топливная система на сжиженном газе
class LpgMouth : TankMouth(FuelType.LPG) {
fun fuelLpg(liters: Int) {
if (fuelType != FuelType.LPG) {
throw CustomException("Недопустимый тип топлива")
}
// Открыть бак
this.open()
// Заправим бак
this.reciveFuel(liters)
println("заправлено: ${liters}, всего в баке ${this.currentFuel}")
// Закрыть бак
this.close()
}
}

7 changes: 6 additions & 1 deletion src/main/kotlin/ru/otus/cars/Taz.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ object Taz: Car {
/**
* Номерной знак
*/
override val plates: Car.Plates
override val plates: Car.CarPlates
get() = throw NotImplementedError("Номера сняты")

/**
Expand Down Expand Up @@ -36,4 +36,9 @@ object Taz: Car {
override fun wheelToLeft(degrees: Int) {
throw NotImplementedError("Руля нет")
}

// Горловина
override val tankMouth: TankMouth
get() = throw NotImplementedError("Топливной системы нет")

}
22 changes: 20 additions & 2 deletions src/main/kotlin/ru/otus/cars/Vaz2107.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
}
}

override fun build(plates: Car.Plates): Vaz2107 = Vaz2107("Зеленый").apply {
override fun build(plates: Car.CarPlates): Vaz2107 = Vaz2107("Зеленый").apply {
this.engine = getRandomEngine()
this.plates = plates
this.tankMouth = LpgMouth() // топливная система = сжиженный газ
}

/**
Expand Down Expand Up @@ -54,7 +55,7 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
* Доступно сборщику
* @see [build]
*/
override lateinit var plates: Car.Plates
override lateinit var plates: Car.CarPlates
private set

// Выводим состояние машины
Expand All @@ -74,5 +75,22 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
override fun getCurrentSpeed(): Int {
return [email protected]
}

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

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

override fun reciveFuel(liters: Int) {
[email protected](liters)
}
}

// Топливная система будет определена при установке на авто
override lateinit var tankMouth: TankMouth
private set

}
19 changes: 17 additions & 2 deletions src/main/kotlin/ru/otus/cars/Vaz2108.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,10 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) {
}
}

override fun build(plates: Car.Plates): Vaz2108 = Vaz2108("Красный").apply {
override fun build(plates: Car.CarPlates): Vaz2108 = Vaz2108("Красный").apply {
this.engine = getRandomEngine()
this.plates = plates
this.tankMouth = PetrolMouth() // топливная система = бензин
}

fun alignWheels(vaz2108: Vaz2108) {
Expand Down Expand Up @@ -58,7 +59,7 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) {
* Доступно сборщику
* @see [build]
*/
override lateinit var plates: Car.Plates
override lateinit var plates: Car.CarPlates
private set

// Выводим состояние машины
Expand All @@ -78,5 +79,19 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) {
override fun getCurrentSpeed(): Int {
return [email protected]
}
override fun getContenst(): Int {
return [email protected]()
}

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

override fun reciveFuel(liters: Int) {
[email protected](liters)
}
}

// Горловина
override lateinit var tankMouth: TankMouth
}
3 changes: 1 addition & 2 deletions src/main/kotlin/ru/otus/cars/VazPlatform.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ abstract class VazPlatform(override val color: String) : Car {
override fun wheelToLeft(degrees: Int) { wheelAngle -= degrees }

// Получить оборудование
override fun getEquipment(): String = "Кузов, колеса, движок"

override fun getEquipment(): String = "Кузов, колеса, движок, топлива ${tankMouth.getContenst()}"
// Абстрактное свойство двигателя
abstract val engine: VazEngine
}
Expand Down
Loading