java - resueltos - para que sirve una clase abstracta
Clase abstracta con todos los métodos concretos (8)
¿Hay algunas situaciones de programación práctica para que alguien declare un resumen de clase cuando todos los métodos en él son concretos?
Buena pregunta :)
Una cosa es segura ... esto es ciertamente posible. La sugerencia de plantilla de krosenvold es una buena razón para hacer esto.
Solo quiero decir que una clase no debe declararse abstract
solo para evitar su creación de instancias.
Esto se menciona en la sección de especificación de lenguaje Java 8.1.1.1
Las respuestas anteriores ya abordaron los principales problemas, pero hay un pequeño detalle que podría valer la pena mencionar.
Podría tener una fábrica que devuelva instancias de subclases (ocultas) de la clase abstracta. La clase abstracta define el contrato en el objeto resultante, así como también proporciona implementaciones predeterminadas, pero el hecho de que la clase sea abstracta evita que se cree una instancia directamente y también señala el hecho de que la identidad de la clase de implementación "real" no es publicado.
Otro posible caso de uso es un decorador que delega todas las llamadas a la instancia envuelta. Una implementación de decorador concreto puede anular solo aquellos métodos donde se agrega la funcionalidad:
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()");
}
}
Aunque realmente no veo la necesidad de declarar a FooDecorator como abstracto (ejemplo no abstracto: HttpServletRequestWrapper ).
Una clase abstracta es una clase que se declara abstracta; puede incluir o no métodos abstractos. No se pueden crear instancias de modo que si tiene una clase abstracta con métodos concretos, entonces se puede subclasificar y luego se puede crear una instancia de la subclase.
Imagine una interfaz cuyos métodos declarados usualmente muestran el mismo comportamiento predeterminado cuando se implementan. Al escribir una clase que necesita soportar la interfaz, debe definir dicho comportamiento predeterminado una y otra vez.
Para facilitar la implementación de sus clases concretas, es posible que desee proporcionar una clase abstracta que proporcione un comportamiento predeterminado para cada método. Para admitir la interfaz en una clase concreta, puede derivar de la clase abstracta y anular los métodos si se desvían del comportamiento estándar. De esta forma, evitará la implementación repetida del mismo comportamiento predeterminado (redundante).
Preguntándose por qué nadie ha señalado el Ejemplo práctico de MouseAdapter:
http://docs.oracle.com/javase/6/docs/api/java/awt/event/MouseAdapter.html
Una clase de adaptador abstracta para recibir eventos de mouse. Los métodos en esta clase están vacíos. Esta clase existe como una conveniencia para crear objetos de escucha.
Bueno, podría estar utilizando un patrón de método de plantilla donde hay múltiples puntos de reemplazo que tienen implementaciones predeterminadas pero donde las implementaciones predeterminadas combinadas por sí solas no son legales, cualquier implementación funcional debe ser una subclase.
(Y sí, no me gusta el patrón de método de la plantilla;))
Cuando tienes una clase importante pero el sistema no puede crear una instancia para esta clase, porque
- esta clase es padre de muchas clases del sistema;
- esto tiene mucha responsabilidad (métodos utilizados por mucha clase) para las necesidades del dominio;
- esta clase no representa un objeto concreto;