Описание классов с использование ООП

217
26 сентября 2017, 05:25

На сколько корректно примерное описание классов?

public static void main(String[] args){
    Animal cat = new Cat(3,"Брсик");
    Animal dog = new Dog(5,"Вульф");
    List<Animal> myAnimal = Arrays.asList(cat, dog);
    for (Animal animal : myAnimal) {
        cat.eat();
        dog.eat();
    }
}
public interface Animal {
    int getAGe();
    String getName();
    void walk();
    void eat();
    void sleep();
}
public abstract class Canidae implements   Animal {
    private final int age;
    private final String name;
    public Canidae(int age, String name) {
        this.age = age;
        this.name = name;
    }
    public int getAGe() {
        return age;
    }
    public String getName() {
        return name;
    }
}
public abstract class Felidae implements Animal {

    private final int age;
    private final String name;
    public Felidae(int age, String name) {
        this.age = age;
        this.name = name;
    }
    public int getAGe() {
        return age;
    }
    public  String getName() {
        return name;
    }

}
public class Dog extends  Canidae {
    public Dog(int age, String name) {
        super(age, name);
    }
    public void walk() {
    }
    @Override
    public void eat() {
        System.out.println("Хрум");
    }
    public void sleep() {
    }
}
public class Cat extends Felidae {

    public Cat(int age, String name) {
        super(age, name);

    }
    public void walk() {
    }
    public void eat() {
        System.out.println("Ням");
    }
    public void sleep() {
    }
}
Answer 1

ИМХО структура явно перегружена. Что изменится если интерфейс Animal сделать абстрактным классом и общим предком Canidae и Felidae? Ответ ничего. Стало быть интерфейс Animal излишен.

Вообще интерфейс описывает не сущность класса, а поведение класса, уже с этой точки зрения интерфейс Animal не выдерживает критики.

Лучше бы сделать интерфейс:

public interface Climbable {  //лазающий
   public void climb();
}

Тогда кошачий класс будет иметь специальное поведение:

public abstract class Felidae extends Animal implements Climbable {
}
Answer 2

По своему скромному мнению хочу отметить несколько проблем, которые я заметил:

  • Если используете поля c модификатором доступа private, то в названии стоит добавить _ (underscore) (может еще стоит начать использовать свойства)
  • В Вашем интерфейсе Animals описаны некоторые методы (eat(), walk(), sleep()). Все вроде бы неплохо, но если к примеру у собаки бессоница ? Или же она к примеру не может ходить. Или из-за своей бессоницы у нее пропал аппетит ? Что тогда ? Если Ваши классы с домашними животными реализовывают этот интерфейс, то по сути, класс который реализует интерфейс, должен описывать все методы, объявленные в интерфейсе.

На Вашем месте, я бы почитал про очень интересный патерн проектирования под названием: стратегия.

Удачи !

READ ALSO
ImageView не отображается в FrameLayout

ImageView не отображается в FrameLayout

Не могу программно поместить изображение (на основе выбранной позиции в spnner) во FrameLayout

210
CalendarView ограничение возможности выбора дат

CalendarView ограничение возможности выбора дат

Подскажите новенькому в Android Studio

216
Парсинг строки в объект Java

Парсинг строки в объект Java

Есть String, в которой Json ответ, как в Java можно распарсить это строку в объект? Есть ли какие-нибудь внешние или стандартные бибилиотеки?

323
Клиент не передает сообщения серверу

Клиент не передает сообщения серверу

Подскажите, пожалуйста в чем может быть проблема - клиент подключается, но не передает данные на сервер ? (В логах пусто) Клиент и сервер находятся...

163