¿Hay alguna situación de programación práctica para que alguien declare un resumen de clase cuando todos los métodos en él son concretos?Clase abstracta con todos los métodos concretos
Respuesta
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;))
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.
Correcto, pero no es la respuesta a la pregunta. –
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
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
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).
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;
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).
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.
estas cosas están reguladas por el constructor protegido en la clase principal .. – tasmaniski
Se pregunta 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 abstracta adaptador para recibir eventos de ratón. Los métodos en esta clase están vacíos. Esta clase existe como una conveniencia para crear objetos de escucha .
- 1. Prueba de clase abstracta Métodos concretos
- 2. Clase abstracta sin métodos abstractos
- 3. Obtenga todos los tipos concretos de ninject
- 4. cómo mantener todos los métodos en una clase con ProGuard
- 5. KnownType para todos los tipos derivados de una clase abstracta?
- 6. registrar todos los métodos?
- 7. php clase abstracta extendiendo otra clase abstracta
- 8. delegado C# y clase abstracta
- 9. ¿Cómo dividir todos los métodos de una clase en GDB?
- 10. ¿Todos los métodos en la clase principal deben ser estáticos?
- 11. clase abstracta no implementa interfaz
- 12. Poner todos los métodos en la definición de clase
- 13. ¿Cómo repito todos los métodos de una clase en Perl?
- 14. ¿Puedo obtener todos los métodos de una clase?
- 15. Clase abstracta con clase anidada, ¿es esto posible?
- 16. Base abstracta o clase auxiliar
- 17. ¿Hay algún problema con una clase con todos los métodos estáticos?
- 18. Mocking método concreto en clase abstracta utilizando phpunit
- 19. abstracción vs clase abstracta
- 20. Listar todos los métodos de una clase dada, excluyendo los métodos de la clase padre en PHP
- 21. Derivar clase abstracta de la clase no abstracta
- 22. clase abstracta estática
- 23. Clase abstracta con campo no inicializado final
- 24. ¿Todos los métodos devuelven `this` a monad?
- 25. ¿Cómo colapsar todos los métodos en XCode?
- 26. Clase abstracta heredada con JPA (+ Hibernate)
- 27. Error: la clase debe declararse abstracta o implementar los métodos restantes
- 28. Genéricos con parámetros genéricos y clase abstracta
- 29. copie todos los nombres de métodos - Intellij
- 30. Redefina los métodos de clase o clase
¿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. –
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