2010-11-30 21 views
7

En this hilo Encontré un momento interesante, Si la clase usa solo como superclase, no hay regla para hacerlo abstracto. ¿Porque?¿En qué casos la superclase no debe ser abstracta?

Gracias

+0

posible duplicado de [¿por qué no es java.lang.Throwable una clase abstracta?] (Http://stackoverflow.com/questions/4306214/why-isnt-java-lang-throwable-an-abstract-class) – EJP

Respuesta

9

Todo depende de si es o no tiene sentido tener instancias de la clase.

Supongamos que, por ejemplo, tiene una clase Dog y una clase Cat. Ambos extienden Animal. Ahora un Animal puede tener un nombre y algunos métodos, pero no tiene sentido tener Animal s corriendo. Un Animal es ... bueno, una noción abstracta.

En otras circunstancias, puede tener subclases (la LinkedHashSet, por ejemplo, se extiende HashSet) pero todavía tiene mucho sentido para crear una instancia de la superclase (HashSet en este caso).


para responder a sus comentarios "¿Tiene sentido hacer una clase no abstracta, incluso si usted no desea crear una instancia."

Bueno, yo diría que si, hoy en día, simplemente no se sabe de ningún caso de uso en el que deba crearse una instancia, se aplica la misma regla: ¿Tiene sentido (lógicamente) tener una instancia de la clase? Si es así, haz que no sea abstracto.

Si la situación es más parecida a "Si ha creado una instancia de esta clase, probablemente lo esté haciendo mal!" entonces aclararía esto haciendo que la clase sea abstracta.

+0

Yeap, gracias. Todavía me interesa, ¿hay algún caso en que usemos clases no abstractas pero no creamos sus instancias? –

+1

Bueno, lo más cercano que puedo pensar es cuando usas el patrón singleton. Entonces no desea crear ninguna instancia después de haber creado una sola instancia. En tales casos, generalmente hace que el constructor sea privado para evitar crear más instancias. – aioobe

+0

Gracias por responder. –

1

Si la clase está completa y es utilizable, tiene sentido que pueda crear instancias y usar la clase, incluso si el usuario decide extenderla más tarde.

La clase solo debe ser abstracta si el usuario necesita implementar alguna lógica para hacerlo funcional dentro del marco en el que se utiliza, es decir, cuando el diseñador de la clase no conoce los detalles de implementación exactos de cómo se usará la clase , como la plantilla o los patrones de diseño del comando, por ejemplo.

+0

Gracias por su segundo párrafo. Es bueno para aclarar. La pregunta es ¿por qué piensas eso? –

4

Siguiendo de @aioobe - Piensa en la siguiente situación.

En una empresa, usted tiene una posición llamada Contador. Ahora, supongamos que tiene a alguien que se especializa en auditoría , y le decimos que su título es Auditor. Ahora, la compañía tiene 100 contadores, pero solo 4 Auditores. En este caso, se desea instantiate tanto Auditor Contador y clases, a pesar de que Contador es una super-clase de Auditor.

+0

Sí. Pero en este caso 'Contador' no solo se usa como una superclase. –

+0

@Stas - Aaah, entiendo a qué te refieres. Lo siento, no pude entender la pregunta. En ese caso, estoy de acuerdo con la publicación de @aioobe. Parece haberlo logrado. –

+0

¿No podría hacer una variable de instancia 'specialties' que tenga el rol' Auditing'? Si un 'Contador' existente se convierte en Auditor, puede llamar al método 'addSpecialty()'. – Eva

Cuestiones relacionadas