Java. Абстракции, интерфейсы, наследования. Как реализовать? Захотелось получше поизучать ООП, а именно проектирование, уровни абстракции и т.д. В кач-ве языка взял 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"); } }
Для решения вашей проблемы с идентификацией пола и выбором соответствующей реализации класса Human, вы можете использовать фабричный метод или фабрику (Factory). Это паттерн проектирования, который позволяет создавать объекты без явного указания конкретного класса.
Например, вы можете создать интерфейс HumanFactory с методом createHuman(), который будет возвращать объект типа Human в зависимости от переданных параметров. Этот метод будет принимать информацию о поле человека (например, наличие кадука) и возвращать соответствующий объект Human.
Примерно так:
public interface HumanFactory { Human createHuman(String name, Boolean kaduk); } public class HumanFactoryImpl implements HumanFactory { @Override public Human createHuman(String name, Boolean kaduk) { if (kaduk) { return new HumanManImpl(name, kaduk); // в зависимости от кадука создаем объект Man или Woman } else { return new HumanWomanImpl(name, kaduk); } } }
Теперь при парсинге данных из БД вы можете создать объект HumanFactoryImpl и использовать его для создания объектов Human, с помощью метода createHuman().
HumanFactory factory = new HumanFactoryImpl(); List<Human> humans = new ArrayList<>(); // Цикл парсинга данных из БД // Вместо прямого вызова конструктора, используем фабрику Human human = factory.createHuman(name, kaduk); humans.add(human);
Таким образом, фабричный метод или фабрика помогут вам выбирать правильную реализацию объекта Human в зависимости от переданных параметров (пола).
Для решения вашей проблемы с идентификацией пола и выбором соответствующей реализации класса Human, вы можете использовать фабричный метод или фабрику (Factory). Это паттерн проектирования, который позволяет создавать объекты без явного указания конкретного класса.
Например, вы можете создать интерфейс HumanFactory с методом createHuman(), который будет возвращать объект типа Human в зависимости от переданных параметров. Этот метод будет принимать информацию о поле человека (например, наличие кадука) и возвращать соответствующий объект Human.
Примерно так:
public interface HumanFactory {Human createHuman(String name, Boolean kaduk);
}
public class HumanFactoryImpl implements HumanFactory {
@Override
public Human createHuman(String name, Boolean kaduk) {
if (kaduk) {
return new HumanManImpl(name, kaduk); // в зависимости от кадука создаем объект Man или Woman
} else {
return new HumanWomanImpl(name, kaduk);
}
}
}
Теперь при парсинге данных из БД вы можете создать объект HumanFactoryImpl и использовать его для создания объектов Human, с помощью метода createHuman().
HumanFactory factory = new HumanFactoryImpl();List<Human> humans = new ArrayList<>();
// Цикл парсинга данных из БД
// Вместо прямого вызова конструктора, используем фабрику
Human human = factory.createHuman(name, kaduk);
humans.add(human);
Таким образом, фабричный метод или фабрика помогут вам выбирать правильную реализацию объекта Human в зависимости от переданных параметров (пола).