Skip to content

add homework#4 Object Orientied Programming #43

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 tankMouth: TankMouth

/**
* Получить оборудование
*/
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 getFuelContents(): Int
}
5 changes: 5 additions & 0 deletions src/main/kotlin/ru/otus/cars/Fuel.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.otus.cars

enum class Fuel {
Petrol, Lpg
}
29 changes: 29 additions & 0 deletions src/main/kotlin/ru/otus/cars/GasStation.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package ru.otus.cars

class GasStation {
fun refuelCar(car: Car, liters: Int){
try{
when(car.tankMouth.typeFuel){
Fuel.Petrol -> refuelingPetrol(car,liters)
Fuel.Lpg -> refuelingLpg(car,liters)
}
}
catch (e: Exception){
println("Заправка неуспешная: $e")
}
}

private fun refuelingPetrol(car: Car, liters: Int){
println("Начать заправку машины $car бензином $liters л.")
car.tankMouth.open()
car.tankMouth.refuelTank(liters)
car.tankMouth.close()
}

private fun refuelingLpg(car: Car, liters: Int){
println("Начать заправку машины $car газом $liters л.")
car.tankMouth.open()
car.tankMouth.refuelTank(liters)
car.tankMouth.close()
}
}
31 changes: 31 additions & 0 deletions src/main/kotlin/ru/otus/cars/Tank.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package ru.otus.cars

interface Tank {
/**
* Количество топлива
*/
val amountFuel: Int

/**
* Получить уровень топлива
*/
fun getContents(): Int

/**
* Заполнить топливо
*/
fun receiveFuel(liters: Int)
}

open class CarTank() : Tank {
override var amountFuel = 0

override fun getContents(): Int {
return amountFuel
}

override fun receiveFuel(liters: Int){
amountFuel += liters
}
}

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

/**
* Горловина бака
*/
abstract class TankMouth(protected val tank: Tank, val typeFuel: Fuel) {
protected var openFlag: Boolean = false

fun open() {
if (openFlag){
println("Горловина бака уже открыта")
} else {
openFlag = true
println("Горловина бака открыта")
}
}

fun close() {
if (openFlag){
openFlag = false
println("Горловина бака закрыта")
} else {
println("Горловина бака уже закрыта")
}
}

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

abstract fun refuelTank(amount: Int)

override fun toString(): String {
return "Горловина бака для топлива вида: $typeFuel"
}
}


class MouthPetrol(tank: Tank) : TankMouth(tank, Fuel.Petrol){
override fun refuelTank(amount: Int){
if (openFlag){
println("Заправка $typeFuel : $amount л.")
tank.receiveFuel(amount)
} else {
println("Откройте бак перез заправкой")
}
}
}
class MouthLpg(tank: Tank) : TankMouth(tank, Fuel.Lpg){
override fun refuelTank(amount: Int) {
if (openFlag){
println("Заправка $typeFuel : $amount л.")
tank.receiveFuel(amount)
} else {
println("Откройте бак перез заправкой")
}
}
}
19 changes: 19 additions & 0 deletions src/main/kotlin/ru/otus/cars/Taz.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package ru.otus.cars

import kotlin.random.Random

object Taz: Car {
/**
* Номерной знак
Expand All @@ -18,6 +20,17 @@ object Taz: Car {
override val carOutput: CarOutput
get() = throw NotImplementedError("Приборов нет")

val tank: Tank = TazTank()

private fun getRandomTankMouth(): TankMouth {
return when (Random.nextInt(0, 2)) {
0 -> MouthLpg(tank)
else -> MouthPetrol(tank)
}
}

override val tankMouth: TankMouth = getRandomTankMouth()

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

class TazTank(): CarTank(){
override fun receiveFuel(liters: Int){
throw Exception("При заправке происходит взрыв бака")
}
}
15 changes: 13 additions & 2 deletions src/main/kotlin/ru/otus/cars/Vaz2107.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package ru.otus.cars

import ru.otus.cars.Vaz2108.Companion
import kotlin.random.Random

/**
Expand All @@ -18,8 +19,11 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
}

override fun build(plates: Car.Plates): Vaz2107 = Vaz2107("Зеленый").apply {
val tank = CarTank()
this.engine = getRandomEngine()
this.plates = plates
this.tankMouth = MouthLpg(tank)
this.carOutput = VazOutput(tank)
}

/**
Expand Down Expand Up @@ -65,14 +69,21 @@ class Vaz2107 private constructor(color: String) : VazPlatform(color) {
/**
* Делегируем приборы внутреннему классу
*/
override val carOutput: CarOutput = VazOutput()
override lateinit var carOutput: CarOutput

override lateinit var tankMouth: TankMouth

/**
* Имеет доступ к внутренним данным ЭТОГО ВАЗ-2107!
*/
inner class VazOutput : CarOutput {
inner class VazOutput(val tank: Tank) : CarOutput {

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

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

override fun build(plates: Car.Plates): Vaz2108 = Vaz2108("Красный").apply {
val tank = CarTank()
this.engine = getRandomEngine()
this.plates = plates
this.tankMouth = MouthPetrol(tank)
this.carOutput = VazOutput(tank)
}

fun alignWheels(vaz2108: Vaz2108) {
Expand Down Expand Up @@ -69,14 +72,20 @@ class Vaz2108 private constructor(color: String) : VazPlatform(color) {
/**
* Делегируем приборы внутреннему классу
*/
override val carOutput: CarOutput = VazOutput()
override lateinit var carOutput: CarOutput

override lateinit var tankMouth: TankMouth

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

override fun getFuelContents(): Int {
return tank.getContents()
}
}
}
2 changes: 1 addition & 1 deletion src/main/kotlin/ru/otus/cars/VazPlatform.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@ sealed class VazEngine {

data class LADA_2107(override val volume: Int) : VazEngine()
data class SAMARA_2108(override val volume: Int) : VazEngine()
}
}
30 changes: 29 additions & 1 deletion src/main/kotlin/ru/otus/cars/main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ fun main() {
techChecks()
println("\n===> Taz...")
println(Taz.color)

println("\n===> refuel car...")
refuelCar()

}

fun driveCars() {
Expand All @@ -31,7 +35,7 @@ fun driveCars() {

fun innerNestedCheck() {
val vaz = Vaz2107.build(Car.Plates("123", 77))
val output = vaz.VazOutput() // Создаем новый объект ИЗ ЭКЗЕМПЛЯРА МАШИНЫ
val output = vaz.carOutput // Создаем новый объект ИЗ ЭКЗЕМПЛЯРА МАШИНЫ

println("Скорость до проверки: ${output.getCurrentSpeed()}") // Выводит 0
Vaz2107.test(vaz) // Газуем...
Expand Down Expand Up @@ -90,4 +94,28 @@ 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 cars = listOf(
Vaz2107.build(Car.Plates("123", 45)),
Vaz2108.build(Car.Plates("456", 72)),
Taz
)

val gasStation = GasStation()

cars.forEach{
println("Машина $it , ${it.tankMouth} , бак содержит ${it.tankMouth.getContents()} л.")
}

cars.forEach{
println("-------------------------------------")
gasStation.refuelCar(it, 5)
println("-------------------------------------")
}

cars.forEach{
println("Машина $it , ${it.tankMouth} , бак содержит ${it.tankMouth.getContents()} л.")
}
}