🗒 Задача¶
В тамагочи есть лиса, собака и кошка. Они могут только есть и спать.
Лиса ест ягоды, собака – кости, а кошка – рыбу. У каждого животного есть имя. Эти действия отображаются в консоли по такому шаблону: “[имя] -> [действие]”.
- опиши эти классы, используя полиморфизм;
- создай по одному объекту животного, сохрани их в список с принудительным указанием типа списка;
- в цикле вызывай метод приема пищи для каждого экземпляра.
❌ Ошибки¶
-
переопределяют вообще все методы, но спать — это реализация по умолчанию
-
не делают абстрактным класс, для которого не планируется создавать объект
✏️ Комментарии¶
В условии еще есть информация о том, что все звери могут спать. Это признак того, что для этого действия можно сделать реализацию по умолчанию в абстрактном классе и не переопределять его.
С едой иначе – так как у каждого своя . Поэтому лучше тут сделать абстрактную функцию и реализовывать ее в дочерних классах.
Корректнее сделать класс абстрактным. Это позволит подчеркнуть, что данный класс не предназначен для создания экземпляров, а служит только для базового описания
Функции в классах следует группировать (по возможности) по модификатору, чтобы код выглядел чище. Например, если в классе разные функции, то сначала могут идти абстрактные, потом публичные простые, в конце приватные.
🧾 Решение¶
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()
}
}