Абстрактный класс со всеми конкретными методами

Есть ли какие-то практические ситуации программирования для кого-то, чтобы объявить абстрактный класс, когда все методы в нем конкретны?

Ответы

Ответ 1

Ну, вы можете использовать шаблон метода шаблона, где есть несколько точек переопределения, все из которых имеют реализации по умолчанию, но где объединенные реализации по умолчанию сами по себе не являются законными - любая функциональная реализация должна подкласса.

(И да, мне не нравится шаблон шаблона шаблона;))

Ответ 2

Абстрактный класс - это класс, объявленный абстрактом - он может включать или не включать абстрактные методы. Они не могут быть созданы, поэтому, если у вас есть абстрактный класс с конкретными методами, тогда он может быть подклассом, и тогда подкласс может быть создан.

Ответ 3

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

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

Ответ 4

Другим возможным случаем использования является декоратор, который делегирует все вызовы обернутому экземпляру. Реализация конкретного декоратора может переопределять только те методы, в которых добавлена ​​функциональность:

public interface Foo {
    public void bar();
}
public abstract class FooDecorator implements Foo {
    private final Foo wrapped;
    public FooDecorator(Foo wrapped) { this.wrapped = wrapped; }
    public void bar() { wrapped.bar(); }
}
public class TracingFoo extends FooDecorator {
    //Omitting constructor code...
    public void bar() {
        log("Entering bar()");
        super.bar();
        log("Exiting bar()");
    }
}

Хотя я действительно не вижу необходимости декларировать FooDecorator как абстрактный (не абстрактный пример: HttpServletRequestWrapper).

Ответ 5

Предыдущие ответы уже затронули основные проблемы, но есть незначительные детали, которые можно было бы упомянуть.

У вас может быть factory, который возвращает экземпляры (скрытых) подклассов абстрактного класса. Абстрактный класс определяет контракт по результирующему объекту, а также предоставляет реализации по умолчанию, но тот факт, что класс является абстрактным, не позволяет ему быть непосредственно созданным, а также сигнализирует о том, что личность "реального" класса реализации не является опубликован.

Ответ 6

Интересно, почему никто не указал на практический пример MouseAdapter:

http://docs.oracle.com/javase/6/docs/api/java/awt/event/MouseAdapter.html

Абстрактный класс адаптера для получения событий мыши. Методы в этот класс пуст. Этот класс существует как удобство для создания слушателей.

Ответ 7

Хороший вопрос:)

Одно можно сказать наверняка... это, безусловно, возможно. Шаблонное предложение krosenvold - одна из веских причин для этого.

Я просто хочу сказать, что класс не должен быть объявлен abstract только для предотвращения его создания.

Это указано в Спецификации языка Java Раздел 8.1.1.1

Ответ 8

Если у вас есть важный класс, но система не может создать экземпляр для этого класса, потому что

  • этот класс является родителем множества классов системы;
  • у этого есть большая ответственность (методы, используемые большим классом) для домена требуется;
  • этот класс не представляет собой конкретный объект;