@thatmaniscool

Правильно ли я реализую абстрактный класс?

Правильно ли я понимаю, что абстрактный класс реализует базовый функционал, а классу наследнику передается лишь определенная часть функционала?
Предположим, у меня есть задача по извлечению ключей из строки. Поскольку строка может быть разной и извлекать нужно будет разные типы ключей, то для меня имеет смысл создать абстрактный класс, базовый функционал которого просто будет хранить обработанные ключи.
public abstract class KeyExtractor {
    private List<String> list = null;
    private List<String> keys = null;
    public KeyExtractor() {
        keys = new ArrayList<>();
        list = new ArrayList<>();
        list.add("Key: @123");
        list.add("Key: @456");
        list.add("Key: @789");
    }

    public void extract (){
        keys = list.stream().map(s -> {
            return keyExtract(s);
        }).collect(Collectors.toList());

        System.out.println(keys);
    }

    public abstract String keyExtract (final String s);

}


Далее я создаю класс наследник от абстрактного класса, где реализую логику по извлечению ключей.
public class Extractor extends KeyExtractor{
    @Override
    public String keyExtract(String s) {
        Pattern pattern = Pattern.compile("(?<=\\@)\\d+");
        Matcher matcher = pattern.matcher(s);
        if(matcher.find()){
            return matcher.group();
        }
        return null;
    }
}

Правильно ли я понял замысел абстрактного класса?
  • Вопрос задан
  • 125 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Wan-Derer
Зобанели на Хабре, волки́ ;((
абстрактный класс реализует базовый функционал, а классу наследнику передается лишь определенная часть функционала?

Вроде наоборот :) Конкретный класс расширяет абстрактный, т.е. добавляет ему возможностей. Например, абстрактный Animal{} может и не уметь "говорить", поэтому метод void say(){} ему задавать не надо. И Fish extends Animal{} не будет иметь этого метода, а Dog extends Animal{} будет.
Либо класс может уточнять абстрактный класс. Пример: Animal может иметь абстрактный метод void move();, а потомки будут обязаны его реализовать: птичка будет летать, рыбка плавать, а собачка бегать.
Как-то так :)
Ответ написан
Комментировать
AshBlade
@AshBlade
Просто хочу быть счастливым
На мой взгляд
базовый функционал
надо заменить на
общий функционал
и
определенная часть функционала
на
конкретная реализация функционала
, т.к. здесь скорее всего пример Шаблонного метода.
В общем случае, догадка верна - абстрактный класс может использоваться в качестве базовой реализации на основании которой создаются другие классы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы