2008-12-12 12 views

Respuesta

13

Bien podría estar usando 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í mismas no son legales, cualquier implementación funcional debe ser una subclase.

(Y sí, me gusta el Template Method;))

+0

¿Qué es lo que no les gusta del patrón Método de plantilla? Ciertamente puede ser mal utilizado, pero cuando se usa con prudencia, me parece bastante útil. –

+2

Bloquea el diseño con mucha fuerza y ​​causa soluciones desagradables cuando las cosas no resultan del todo como creías. También tiende a crear jerarquías de clase muy contaminadas, así como muchos acoplamientos extraños. – krosenvold

4

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.

+1

Correcto, pero no es la respuesta a la pregunta. –

0

Niza 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 conoce en el lenguaje Java Especificación Section 8.1.1.1

+0

Tu enlace tiene que ser modificado: [8.1.1.1. Clases abstractas] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.1.1) o [8.8.10. Prevención de la ejecución de una clase] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.10) – Sk8erPeter

4

Immagine una interfaz cuyos métodos declarados por lo general muestran el mismo comportamiento por defecto cuando se implementa. 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).

0

Cuando se tiene una clase importante, pero el sistema no puede crear una instancia fo esta clase, porque

  • esta clase es el padre de un montón de clases del sistema;
  • esto tiene mucha responsabilidad (métodos utilizados por mucha clase) para los dominios;
  • esta clase no representa un objeto concreto;
2

Otro posible caso de uso es un decorador que delega todas las llamadas a la instancia envuelta. Una aplicación concreta decorador puede anular sólo aquellos procedimientos en los que se añade 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 el necessarity declarar FooDecorator tan abstracto (ejemplo no abstracta: HttpServletRequestWrapper).

2

Las respuestas anteriores ya abordaron los principales problemas, pero hay un pequeño detalle que podría valer la pena mencionar.

Puede tener una fábrica que devuelva instancias de subclases (ocultas) de la clase abstracta.La clase abstracta define el contrato en el objeto resultante, además de proporcionar 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.

+1

estas cosas están reguladas por el constructor protegido en la clase principal .. – tasmaniski

Cuestiones relacionadas