С нуля до джуна #11

В понедельник был новый урок и мы проходили новую тему наследование. По ней мы делали такую задачу:

Есть класс машин, каждая машина в этом классе имеет марку, модель, год выпуска, тип мотора(бензин, дизель и электро). Для каждой машины есть объем двигателя, состояние мотора(запущен или заглушен). Нужно сделать класс для бензиновых машин, дизельных и электро, они наследуются от обычной машины. Функция, которая запускает или глушит машину, дизельную или бензиновую можно, а электро нельзя заглушить(по умолчанию true). Функция чтобы проехать машине(пробег). передаем пробег, выдать функцию что машина проехала пробег и + в пробег 10к, если пробег больше 100к, то больше ехать не может, сообщение о ремонте. Для дизельных 80к предел. Для электро 50к предел.

Решение:

Создаем функцию Car и добавляем туда все свойства и создаем конструктор, для типа мотора я решил использовать константы.

open class Car { companion object { const val GASOLINE = "Бензин" const val DIESEL = "Дизель" const val ELECTRO = "Электро" } val brand: String val model: String val yearOfIssue: Int val engineDisplacement: Double var conditionMotor: Boolean val typeEngine: String var mileage: Int constructor(valBrand: String, valModel: String, valYearOfIssue: Int, valEngine: Double, valConditionMotor: Boolean, valTypeEngine: String, valMileage: Int) { brand = valBrand model = valModel yearOfIssue = valYearOfIssue engineDisplacement = valEngine conditionMotor = valConditionMotor typeEngine = valTypeEngine mileage = valMileage } }

open - нужно для того чтобы можно было наследоваться к этому классу.

Далее создал 3 класса: ElectroCar, DieselCar, ElectroCar и прописал в каждом чтобы он наследовался от класса Car

class ElectroCar(valBrand: String, valModel: String, valYearOfIssue: Int, valEngine: Double, valConditionMotor: Boolean, valTypeEngine: String, valMileage: Int): Car(valBrand, valModel, valYearOfIssue, valEngine, valConditionMotor, valTypeEngine, valMileage) { }

для остальных также, только название класса другое.

В main файле создал объекты для каждой машины(все данные в основном ставил на рандом ибо лень гуглить, главное чтоб работало)

fun main() { val dieselCar = DieselCar("BMW", "X5", 2020, 4.4, false, Car.DIESEL, 72800) val gasolineCar = GasolinCar("Lada", "2114", 1980, 1.3, false, Car.GASOLINE, 69000) val electroCar = ElectroCar("Tesla", "Model 3", 2015, 1.1, true, Car.ELECTRO, 30000) }

Далее создал в классе car функцию для вывода информации об машине чтобы проверить что все как надо работает:

fun carInfo() { println("--------------Информация о машине--------------------------") println("Марка: $brand") println("Модель: $model") println("Год выпуска: $yearOfIssue") println("Объем двигателя: $engineDisplacement") println("Состояние двигателя: $conditionMotor") println("Тип двигателя: $typeEngine") println("Пробег: $mileage") println("-----------------------------------------------------------") }

пример вывода для электро машины:

--------------Информация о машине-------------------------- Марка: Tesla Модель: Model 3 Год выпуска: 2015 Объем двигателя: 1.1 Состояние двигателя: true Тип двигателя: Электро Пробег: 30000 -----------------------------------------------------------

все работает, можно продолжать

Сделал функции для старта и выключения машины(знаю что можно как то по правильному назвать типо зажигания или заглушение, но мне пофиг)

fun startEngine() { if(conditionMotor != true){ conditionMotor = true println("$typeEngine, $brand, $model машина запущена") } else{ println("$typeEngine, $brand, $model машина уже запущена") } } fun offEngine() { if(typeEngine != ELECTRO && conditionMotor != false){ conditionMotor = false println("$typeEngine, $brand, $model машина заглушена") } else if(typeEngine == ELECTRO){ println("$typeEngine, $brand, $model машину заглушить нельзя") } else{ println("$typeEngine, $brand, $model машина уже заглушена") } }

Опять же проверки, что если машина запущена/заглушена, то этого уже сделать нельзя, если это електро машина, то заглушить нельзя.

Пример:

fun main() { val dieselCar = DieselCar("BMW", "X5", 2020, 4.4, false, Car.DIESEL, 72800) val gasolineCar = GasolinCar("Lada", "2114", 1980, 1.3, false, Car.GASOLINE, 69000) val electroCar = ElectroCar("Tesla", "Model 3", 2015, 1.1, true, Car.ELECTRO, 30000) electroCar.startEngine() electroCar.offEngine() gasolineCar.offEngine() gasolineCar.startEngine() dieselCar.startEngine() dieselCar.offEngine() }
Вывод: Электро, Tesla, Model 3 машина уже запущена Электро, Tesla, Model 3 машину заглушить нельзя Бензин, Lada, 2114 машина уже заглушена Бензин, Lada, 2114 машина запущена Дизель, BMW, X5 машина запущена Дизель, BMW, X5 машина заглушена

Далее взялся за функцию с проверкой пробега:

в классе car создал основную функцию

open fun checkMileage() { if(mileage >= 100000) { println("Вы проехали на $brand, $model $mileage, $mileage, вам нужен ремонт!") } else { println("Вы проехали: $mileage") mileage += 10000 } }

open нужно опять же чтобы можно было наследоваться

впринципе уже можно проверять, но у каждого типа машины есть свой лимит пробега, а писать проверки на тип машины скучно, поэтому решил сделать по другому:

класс ElectroCar:

class ElectroCar(valBrand: String, valModel: String, valYearOfIssue: Int, valEngine: Double, valConditionMotor: Boolean, valTypeEngine: String, valMileage: Int): Car(valBrand, valModel, valYearOfIssue, valEngine, valConditionMotor, valTypeEngine, valMileage) { override fun checkMileage() { if(mileage >= 50000) { println("Вы проехали на $brand, $model $mileage, вам нужен ремонт!") } else { println("Вы проехали: $mileage") mileage += 10000 } } }

Override — это переопределение или модификация метода базового класса в его производном классе. Т.е. это нужно чтобы мы одну и ту же функцию могли менять в разных классах типа

Просто поменял на нужный лимит

DieselCar

class DieselCar(valBrand: String, valModel: String, valYearOfIssue: Int, valEngine: Double, valConditionMotor: Boolean, valTypeEngine: String, valMileage: Int): Car(valBrand, valModel, valYearOfIssue, valEngine, valConditionMotor, valTypeEngine, valMileage) { override fun checkMileage() { if(mileage >= 80000) { println("Вы проехали на $brand, $model $mileage, вам нужен ремонт!") } else { println("Вы проехали: $mileage") mileage += 10000 } } }

GasolineCar

class GasolinCar(valBrand: String, valModel: String, valYearOfIssue: Int, valEngine: Double, valConditionMotor: Boolean, valTypeEngine: String, valMileage: Int): Car(valBrand, valModel, valYearOfIssue, valEngine, valConditionMotor, valTypeEngine, valMileage) { }

пусто, потому что его лимит стоит в функции класса Car, так что смысла изменять нет.

Ну собственно проверочка:

main

fun main() { val dieselCar = DieselCar("BMW", "X5", 2020, 4.4, false, Car.DIESEL, 72800) val gasolineCar = GasolinCar("Lada", "2114", 1980, 1.3, false, Car.GASOLINE, 69000) val electroCar = ElectroCar("Tesla", "Model 3", 2015, 1.1, true, Car.ELECTRO, 30000) gasolineCar.checkMileage() gasolineCar.checkMileage() gasolineCar.checkMileage() gasolineCar.checkMileage() gasolineCar.checkMileage() gasolineCar.carInfo() }
Вывод: Вы проехали: 69000 Вы проехали: 79000 Вы проехали: 89000 Вы проехали: 99000 Вы проехали на Lada, 2114 109000, 109000, вам нужен ремонт! --------------Информация о машине-------------------------- Марка: Lada Модель: 2114 Год выпуска: 1980 Объем двигателя: 1.3 Состояние двигателя: false Тип двигателя: Бензин Пробег: 109000 -----------------------------------------------------------

Еще:

main

fun main() { val dieselCar = DieselCar("BMW", "X5", 2020, 4.4, false, Car.DIESEL, 72800) val gasolineCar = GasolinCar("Lada", "2114", 1980, 1.3, false, Car.GASOLINE, 69000) val electroCar = ElectroCar("Tesla", "Model 3", 2015, 1.1, true, Car.ELECTRO, 30000) electroCar.checkMileage() electroCar.checkMileage() electroCar.checkMileage() electroCar.carInfo() }
Вывод: Вы проехали: 30000 Вы проехали: 40000 Вы проехали на Tesla, Model 3 50000, вам нужен ремонт! --------------Информация о машине-------------------------- Марка: Tesla Модель: Model 3 Год выпуска: 2015 Объем двигателя: 1.1 Состояние двигателя: true Тип двигателя: Электро Пробег: 50000 -----------------------------------------------------------

и последнее:

main

fun main() { val dieselCar = DieselCar("BMW", "X5", 2020, 4.4, false, Car.DIESEL, 72800) val gasolineCar = GasolinCar("Lada", "2114", 1980, 1.3, false, Car.GASOLINE, 69000) val electroCar = ElectroCar("Tesla", "Model 3", 2015, 1.1, true, Car.ELECTRO, 30000) dieselCar.checkMileage() dieselCar.checkMileage() dieselCar.checkMileage() dieselCar.carInfo() }
Вывод: Вы проехали: 72800 Вы проехали на BMW, X5 82800, вам нужен ремонт! Вы проехали на BMW, X5 82800, вам нужен ремонт! --------------Информация о машине-------------------------- Марка: BMW Модель: X5 Год выпуска: 2020 Объем двигателя: 4.4 Состояние двигателя: false Тип двигателя: Дизель Пробег: 82800 -----------------------------------------------------------

На этом собственно все, все работает, можно отдыхать. Задачка не сложная, но довольно интересная. Возможно на следующей неделе будет долго выходить пост, т.к. я работаю и времени свободного на след. неделе практически не будет, сори.

Всем спасибо за внимание!

P.s. подписывайтесь на тг канал, там бывают новости из моей жизни

11
9 комментариев

Поставь какой-нибудь тег, чтобы можно было его закинуть в ЧС

1
Ответить

уважаемо

Ответить

на чем это, плюсы?

Ответить

котлин

1
Ответить

Непродуманный код. А именно:
1) полотно из параметров в конструкторе, убрать
2) ненужный параметр перечисления вида двигателя, убрать.
3) параметр проверки состояния двигателя в конструкторе- убрать. перенести в сущность двигателя
4) метод offEngine корявый. Уже же используешь переопределение.
Почитай, про ооп и solid - поймешь почему и как. Это беглый взгляд на код

Ответить

Не обязательно даже каждую унаследовать, можно сразу в car пихать, разве что для того чтобы показать как наследование работает

1
Ответить

Окей, посмотрю, спасибо

Ответить