Перейти к содержанию

🗒 Задача

В тамагочи есть лиса, собака и кошка. Они могут только есть и спать.

Лиса ест ягоды, собака – кости, а кошка – рыбу. У каждого животного есть имя. Эти действия отображаются в консоли по такому шаблону: “[имя] -> [действие]”.

  • опиши эти классы, используя полиморфизм;
  • создай по одному объекту животного, сохрани их в список с принудительным указанием типа списка;
  • в цикле вызывай метод приема пищи для каждого экземпляра.

❌ Ошибки

  • переопределяют вообще все методы, но спать — это реализация по умолчанию

  • не делают абстрактным класс, для которого не планируется создавать объект

✏️ Комментарии

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

С едой иначе – так как у каждого своя . Поэтому лучше тут сделать абстрактную функцию и реализовывать ее в дочерних классах.
Корректнее сделать класс абстрактным. Это позволит подчеркнуть, что данный класс не предназначен для создания экземпляров, а служит только для базового описания
Функции в классах следует группировать (по возможности) по модификатору, чтобы код выглядел чище. Например, если в классе разные функции, то сначала могут идти абстрактные, потом публичные простые, в конце приватные.

🧾 Решение

abstract class Animal(val name: String) {
    abstract fun eat()

    fun sleep() {
        println("$name -> спит")
    }
}

class Fox(name: String) : Animal(name) {
    override fun eat() {
        println("$name -> ест ягоды")
    }
}

class Dog(name: String) : Animal(name) {
    override fun eat() {
        println("$name -> грызет кости")
    }
}

class Cat(name: String) : Animal(name) {
    override fun eat() {
        println("$name -> ест рыбу")
    }
}

fun main() {
    val fox = Fox("Лиса Алиса")
    val dog = Dog("Собака Бобик")
    val cat = Cat("Кошка Мурка")

    val animals: List<Animal> = listOf(fox, dog, cat)

    for (animal in animals) {
        animal.eat()
    }
}