Захотелось получше поизучать ООП, а именно проектирование, уровни абстракции и т.д. В кач-ве языка взял Java.
Сейчас пишу проект, дабы познать дзен и абстракции над абстракциями и возникло несколько вопросов.
В кач-ве примера буду говорить о людях (Human).
К примеру, есть основной интерфейс IHuman, в котором описаны методы, void say(String text), void jump().
Также есть класс Human с конструктом Human(String name, Boolean kaduk). Но объекты в программу попадают "извне" (в моем случае БД), значит нужен метод который будет распаршивать данные из таблицы и возвращать коллекцию List. В моем случае это статический публичный метод, который находится в классе Human. Правильно ли это? Или же такой метод должен находится статически в самом интерфейсе? Или ...?
Второй момент. Люди различаются по полу и на фоне этого признака ведут себя по разному при вызове методов. В случае с say - их поведение одинакого, но вот jump() абсолютно разный. Также, когда коллекция наполняется данными (людьми), мы не знаем какой именно объект нам подсовывают, это определяется потом, вызовом метода void checkKaduk(). Мое видение на весь этот сексизм следующий:
Создаем абстрактный класс AHuman, который реализует IHuman, описываем в нем всю структура класса (Свойства, конструктор) и реализуем метод say. Но вот дальше не совсем понимаю как сделать определение пола, вызов нужного метода jump.
Необходимо сделать две реализации по типу public class HumanManImpl extends AHuman { }, и такой же для Woman и в обоих перееопределить jump, но в таком случае наш парсер из БД работать не будет, т.к. тут сразу нужно знать какой тип нужен, а инициализивать абстрактный класс нельзя.
Если я правильно понимаю, то нужно делать еще один класс, который будет поддерживать генерики, в момент парсинга из БД мы не знаем какая именно реализация нужна и указываем <?>, далее для каждого объекта из нового класса с генериками вызываем метод, который будет узнавать пол по наличию кадыка, и преобразовываться(?) в нужный тип. Но не могу понять как это все реализовать. Даже если мои домыслы не верны, то все-ровно хотелось бы узнать ответ, как реализовать вышеописанное.
Небольшие наброски кода:
// Основной интерфейс
public interface Human {
void say(String text);
void jump();
}
// Абстрактный класс
public abstract class AHuman implements Human {
public String name;
public Boolean kaduk;
public AHuman(String name, Boolean kaduk) {
this.name = name;
this.kaduk = kaduk;
}
public void checkKaduk() {
if (kaduk) {
} else {
}
}
@Override
public void say(String text) {
System.out.println(String.format("%s: %s", name, text));
}
}
// Реализация для Man
public class HumanManImpl extends AHuman {
public HumanManImpl(String name, Boolean kaduk) {
super(name, kaduk);
}
@Override
public void jump() {
System.out.println("Man");
}
}
// для Woman
public class HumanWomanImpl extends AHuman {
public HumanWomanImpl(String name, Boolean kaduk) {
super(name, kaduk);
}
@Override
public void jump() {
System.out.println("Woman");
}
}