Подтвердить что ты не робот

Java как дополнительный метод переопределения в абстрактном классе?

Скажем, у нас есть базовый класс:

public abstract class BaseFragment extends Fragment {
    ...
    protected abstract boolean postExec();
    ...
}

И затем извлечь из него другие классы (например, Fragment_Movie, Fragment_Weather...)

public class Fragment_Music extends BaseFragment{
    @Override
    protected boolean postExec() {
        return false;
    } 
}

Однако при добавлении нового метода в базовый класс:

public abstract class BaseFragment extends Fragment {
    ...
    protected abstract boolean postExec();
    protected abstract boolean parseFileUrls();
    ...
}

Eclipse мгновенно обнаруживает ошибку с запросом реализовать этот новый метод в уже производных классах.

Можно ли добавить абстрактный метод по умолчанию в базовый класс, чтобы он не отображал ошибку, даже если мы не реализуем его в производном классе? (потому что для каждого производного класса потребуется много времени, каждый раз, когда базовый класс добавляет новый метод.)

4b9b3361

Ответ 1

Самое простое решение - добавить метод с окутанной реализацией. Объявление абстрактного требует не абстрактных расширений для реализации метода.

Выполнение чего-то подобного облегчит ваши проблемы с компиляцией, хотя при использовании без переопределения явно будут исключены исключения:

public abstract class BaseFragment extends Fragment {
    protected boolean doSomethingNew() {
        throw new NotImplementedException("method not overridden");
    }
}

Ответ 2

Ожидается, что только абстрактный класс (включая интерфейс) объявит ВСЕ методы из своего базового класса.

Итак, например, интерфейс или абстрактный класс, распространяющийся на один базовый класс или наложенный на один интерфейс, не должен объявлять все методы. Реализация не реализованного метода будет задачей первого более глубокого конкретного подкласса.

Итак, для вашей проблемы вы в конечном итоге можете использовать композицию над наследованием, добавляя коллаборатора (содержащий ваш новый общий метод) в качестве защищенного поля вашего базового класса.

Таким образом, нет необходимости ничего внедрять в ваших конкретных классах и позволять этим использовать метод соавторов в рамках собственного метода подкласса.

Вас может заинтересовать Bridge pattern, цель которого (из Википедии):

Шаблон моста - это шаблон проектирования, используемый в разработке программного обеспечения который предназначен для "отстранения от абстракции от его реализации" что они могут варьироваться независимо друг от друга "

Ответ 3

Цель абстрактных методов - заставить вас их реализовать.

Если вы добавляете абстрактный метод в свой суперкласс, вам нужно реорганизовать свой код и обеспечить реализацию; ваша программа будет несовместимой даже с реализацией по умолчанию - что делать, если вам нужно вернуть собственный тип? Я бы потратил свое время, чтобы обеспечить правильную реализацию, так как мне, вероятно, придется вызвать такие методы, если я их добавлю.

Ответ 4

Вы можете получить новый абстрактный класс с новым абстрактным методом из вашего базового класса. Выведите конкретные классы, которые должны иметь новый метод из этого нового класса и других из старого базового класса.

Ответ 5

сделать ваш общедоступный класс BaseFragment абстрактным

 public abstract class Fragment_Music extends BaseFragment{
              @Override
protected boolean postExec() {
    return false;
} 

    }