Шаблон метода шаблона в Java - PullRequest
0 голосов
/ 31 октября 2019

У меня есть назначение в Java, мне нужна помощь, пожалуйста. Я пытался ее решить, но у меня есть проблема, которая не может их понять.

Назначение: В этом упражнении используйте шаблон метода Template для определения абстрактного класса Filter с открытымФильтр метода (шаблонный метод), вызывающий метод accept (метод ловушки), который может быть реализован различными способами в разных конкретных классах. Напишите тестовую программу, расширив класс Filter и определив accept так, что принимаются только строки длиной не более трех символов.

public abstract class Filter<T> {
    public abstract T[] filter(T[] list);

    public abstract boolean accept(T val);
}

public class FilterTest<T> extends Filter<T> {
    private int capacity = 0;

    public FilterTest(int cap) {
        this.capacity = cap;
    }

    @Override
    public T[] filter(T[] list1) {
        @SuppressWarnings("unchecked")
        T[] finalList = (T[]) Array.newInstance(list1.getClass().getComponentType(), capacity);

        int counter = 0;

        for (T t : list1) {
            if (accept(t)) {
                finalList[counter] = t;
                counter++;
            }
        }

        return finalList;
    }

    public void printArray(T[] list2) {
        for (int i = 0; i < list2.length; i++) {
            if (list2[i] != null) {
                System.out.print(list2[i] + " ");
            }
        }

        System.out.println();
    }

    @Override
    public boolean accept(T val) {
        return String.valueOf(val).length() > 0 && 
            String.valueOf(val).length() <= 3;
    }

    public static void main(String[] args) {
        FilterTest<String> filterTest = new FilterTest<>(8);

        String[] lists = { 
            "Hi", "here", "is", "the", "AOOP", "course", "at", "University" 
        };

        System.out.print("My original list is: ");
        filterTest.printArray(lists);

        System.out.print(" The filtered list is: ");
        String[] filteredList = filterTest.filter(lists);
        filterTest.printArray(filteredList);
    }
}

Вот комментарий от моего учителя:"неверно,только класс accept должен быть абстрактным в классе Filter, метод filter должен быть уже реализован в классе Filter и не быть абстрактным, все реализации будут одинаковыми, только метод accept изменяется для разных фильтров) ".

Я не понимаю, что мне теперь делать, как код будет правильным. помогите, пожалуйста, спасибо

1 Ответ

0 голосов
/ 31 октября 2019

Я предполагаю, что фильтр должен выглядеть примерно так

public abstract class Filter<T> {

    public T[] filter(T[] list1) {
        @SuppressWarnings("unchecked")
        T[] finalList = (T[]) Array.newInstance(list1.getClass().getComponentType(), capacity);

        int counter = 0;

        for (T t : list1) {
            if (accept(t)) {
                finalList[counter] = t;
                counter++;
            }
        }

        return finalList;
    }

    public abstract boolean accept(T val);
}

Вы даже можете объявить Filter<T> как interface и иметь реализацию по умолчанию для фильтра. Взгляните здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...