Абстрактный класс со всеми конкретными методами
Есть ли какие-то практические ситуации программирования для кого-то, чтобы объявить абстрактный класс, когда все методы в нем конкретны?
Ответы
Ответ 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
Если у вас есть важный класс, но система не может создать экземпляр для этого класса, потому что
- этот класс является родителем множества классов системы;
- у этого есть большая ответственность (методы, используемые большим классом) для домена требуется;
- этот класс не представляет собой конкретный объект;