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

Всем здрасте, это новый влох. На новом уроке проходили наследование.

Пример:

Есть человек, нужно через интерфейсы для класса Human задать функции run и swim

fun main() { val human1 = Human("Alex", 18) human1.run() human1.swim() }
interface Runablle { fun run() }
interface Swimablle { fun swim() }
class Human(val name: String, val age: Int) : Runablle, Swimablle { override fun run() { println("$name бегает") } override fun swim() { println("$name плавает") } }
Вывод: Alex бегает Alex плавает

Собственно интерфейсы нужны чтобы можно было, не от 1 класса наследоваться, а от нескольких интерфейсов, как я понял это основная их суть.

Немного измененная задача из прошлых влохов:

Родительский класс Animals, от него наследуются Dog, Tiger, Cat, Animal имплементирует 2 интерфейса, 1 Info(обязывает использовать фун Info), 2ое использовать jumping, swimming, running. сделать интерфейс с функцией randomInjury. от 1 к 3 что животное травмируется, если травмировалось, то дальше не может делать что-то. И сделать функцию для восстановления.

fun main() { val dog1 = Animals("Петя", 15.5, Animals.DOG_TYPE, 50, 20, 5, false) val cat1 = Animals("Барсик", 8.2, Animals.CAT_TYPE, 100, 0, 10, false) val tiger1 = Animals("Лео", 40.1, Animals.TIGER_TYPE, 80, 30, 15, false) dog1.running(25) dog1.running(25) dog1.swimming(17) dog1.recuperation() dog1.jumping(1) }
interface RandomInjury { fun randomInjury() }
interface Info { fun info() }
interface Recuperation { fun recuperation() }
interface Actions { fun running(distance: Int) fun swimming(distance: Int) fun jumping(distance: Int) }
open class Animals : Info, Actions, RandomInjury, Recuperation { companion object { const val DOG_TYPE = "Собака" const val CAT_TYPE = "Кот" const val TIGER_TYPE = "Тигр" } val name: String val weight: Double val type: String val maxRun: Int val maxSwim: Int val maxJump: Int var sleep: Boolean = false var traumatized: Boolean constructor(valName: String, valWeight: Double, valType: String, valMaxRun: Int, valMaxSwim: Int, valMaxJump: Int, varTraumatized: Boolean) { name = valName weight = valWeight type = valType maxRun = valMaxRun maxSwim = valMaxSwim maxJump = valMaxJump traumatized = varTraumatized } constructor(valName: String, valWeight: Double, valType: String, valMaxRun: Int, valMaxSwim: Int, valMaxJump: Int, valSleep: Boolean, varTraumatized: Boolean) { name = valName weight = valWeight type = valType maxRun = valMaxRun maxSwim = valMaxSwim maxJump = valMaxJump sleep = valSleep traumatized = varTraumatized } override fun info() { println("Имя: $name \nВес: $weight \nТип: $type \nМакс. пробег: $maxRun \nМакс. Проплыв: $maxSwim \nМакс. Прыжок: $maxJump \nСпит: $sleep") } fun activateSleep() { sleep = !sleep println("Cпит: $sleep") } override fun randomInjury() { val randomTraumatized = Random.nextInt(1, 3) if(randomTraumatized == 1) { traumatized = true } else{ traumatized = false } } override fun recuperation() { if(traumatized == true){ traumatized = !traumatized } } override fun running(distance: Int) { if(distance <= maxRun && !sleep && !traumatized) { println("$name может пробежать $distance") } else if(sleep){ println("$name не может пробежать, потому что спит") } else if(traumatized) { println("$name не может бежать, т.к. травмирован") } else{ println("$name не может пробежать $distance") } randomInjury() } override fun swimming(distance: Int) { if(distance <= maxSwim && type != CAT_TYPE && !sleep && !traumatized) { println("$name может проплыть $distance") } else if(sleep){ println("$name не может проплыть, потому что спит") } else if(traumatized) { println("$name не может проплыть, т.к. травмирован") } else{ println("$name не может проплыть $distance") } } override fun jumping(distance: Int) { if(distance <= maxJump && !sleep && !traumatized) { println("$name может прыгнуть $distance") } else if(sleep){ println("$name не может прыгнуть, потому что спит") } else if(traumatized) { println("$name не может прыгнуть, т.к. травмирован") } else{ println("$name не может прыгнуть $distance") } } }
Вывод: Петя может пробежать 25 Петя не может бежать, т.к. травмирован Петя может проплыть 17 Петя может прыгнуть 1

За полотно свойств в animals не ругайте, т.к. да, мне лень было переписывать.

Ну и последнее задание/дз:

Программу чтобы ввести свой вес с клавиатуры, предлагает посчитать вес на луне. Если введу 1, то на луне. 2 - на марсе и 3 на солнце

fun main() { print("Введите ваш вес в кг: ") val weight: Double = readln().toDouble() val human1 = CalculatePlanet(weight) human1.calculate(1) human1.calculate(2) human1.calculate(3) }
import kotlin.math.roundToInt class CalculatePlanet(val weight: Double) { companion object { const val MOON = 0.165 const val MARS = 0.378 const val SUN = 27.85 } var res = 0.0 fun info() { println("$weight") } fun calculate(planet: Int) { if(planet == 1) { res = weight * MOON println("Ваш вес ${weight}кг на Луне = ${res}кг") } else if(planet == 2 ){ res = weight * MARS println("Ваш вес ${weight}кг на Марсе = ${res}кг") } else { res = weight * SUN println("Ваш вес ${weight}кг на Солнце = ${res}кг") } } }
Вывод: Введите ваш вес в кг: 69 Ваш вес 69.0кг на Луне = 11.385кг Ваш вес 69.0кг на Марсе = 26.082кг Ваш вес 69.0кг на Солнце = 1921.65кг

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

Всем спасибо за внимание, увидимся на следующей неделе :)

мой тг канал:

22
14 комментариев

вы там switch case не проходили еще что ли?

1

ну кстати как вариант, не додумался

Собственно интерфейсы нужны чтобы можно было, не от 1 класса наследоваться, а от нескольких интерфейсов, как я понял это основная их суть.неправильно понял, это тоже полезно, но основное - это то, что реализация интерфейса - намного менее жесткая связь по сравнению с наследованием. тут разница идеологическая можно сказать

сомнительно, но окей

чушь не пори, если создать абстрактный класс с тем же наполнением, что и интерфейс, то связанность(coupling) будет такой же, интерфейсы как раз решают проблему множественного наследования, в частности ромбовидного(от 1 класса наследуется 2 класса и от этих двух 1)

Че то на непонятном.. Если я чатгпт попрошу решить, он сделает?

попробуй, не интересовался