Наследование классов, переопределение

209
15 октября 2017, 20:42

Делаю потиху задания из решебника и это на третьем пункте меня выбило немного из колеи.

Создать объект класса Котёнок, используя классы Животное, Кошка. Методы:

  1. вывести на консоль имя,

  2. подать голос,

  3. рожать потомство (создавать себе подобных).
public class Main {
        public static void main(String[] args) {
            Cat cat = new Cat();
            Kitten kitten = cat.giveBirth();
            System.out.println(kitten);
            cat.printName();
        }
    }

interface Mother {
    <T extends Animal> Kitten giveBirth();
}

abstract class Animal {
    protected String name;
    abstract void say();
    public void printName() {
        System.out.printf("My name is %s\n", name);
    }
}
class Cat extends Animal implements Mother {
    public Cat() {
        name = "Cat";
    }
    @Override
    public <T extends Animal> Kitten giveBirth() {
        return new Kitten();
    }
    @Override
    public void say() {
        System.out.printf("Meow\n");
    }
}
class Kitten extends Animal {
    public Kitten() {
        name = "Kitten";
    }
    @Override
    public void say() {
        System.out.printf("Meow\n");
    }
}

Как сделать так, чтобы это работало с вывода в main, то есть как-то так:

public class Main {
    public static void main(String[] args) {
        Cat cat = new Cat("nameCat");
        cat.say(); 
        System.out.printf(cat.giveBirth());
        Cat catTwo = new Cat("nameCatTwo");
        catTwo.say(); 
        System.out.printf(catTwo.giveBirth());
    }
}

И правильно ли я понял третий пункт? Что он должен выводить? Почти 6 утра, не понимаю уже ничего. И как корректно переопределить для каждого класса методы equals(), hashCode(), toString()?

Answer 1

У вас класс Kitten, как минимум, неправильно реализован. Вообще, он в целом и не нужен, так как котёнок - это таже кошка, только маленькая.

Но если уж хотите отдельный класс под котёнка, то наследовать его надо от Cat, а не Animal.

Реализация кошки тоже странная: class Cat extends Animal implements Mother. Кот не мать, он не может рожать. Или же тут имелась ввиду кошка именно как самка?

Плюс, вы реализуете этот интерфейс у кошки, а не у базового класса Animal. В таком случае, к примеру, если вы захотите создать класс для собаки Dog, то там тоже будете этот интерфейс реализовывать? По-хорошему, такие вещи нужно как можно выше в иерархии классов реализовывать.

READ ALSO
Сериализация Item&#39;ов

Сериализация Item'ов

Подскажите, как сериализовать созданные Item'ы в панели, их текст, значение CheckBox и кнопку Delete, и дессериализовать при перезапуске программы?...

187
Получение координат в C#

Получение координат в C#

Собственно как получить координаты через gps/wifi/ip? В интернете нашёл видео, где пишут что-то типа

244
Как перебрать массивы массивов через foreach

Как перебрать массивы массивов через foreach

Пытаюсь перебрать массивы массивов через foreach: Ошибка

302
Как обратится к элементу формы из обработчика события, которое вызывается в другом потоке?

Как обратится к элементу формы из обработчика события, которое вызывается в другом потоке?

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

367