Antes de iniciar considere el Ejemplo de late binding; el cual se utilizó en la entrada POO - Consideraciones adicionales para reforzar la idea de polimorfismo.
En directa relación con el ejemplo anterior, no sólo por el polimorfismo, sino como complemento de los mecanismos de abstracción que proporciona un lenguaje de programación, se comentarán brevemente dos aspectos de Java relacionados con dichos mecanismos:
- Las clases abstractas.
- Las Interfaces.
Las
clases abstractas y las interfaces son similares en algunos aspectos: no se puede crear una
instancia de ellas, y ambas pueden contener una combinación de métodos
declarados con o sin una implementación.
Por otro lado, también existen diferencias importantes: con las clases
abstractas se pueden declarar campos que no son static y final, así como
definir métodos concretos públicos, protegidos y privados. Con las
interfaces, todos los campos son automáticamente públicos, static y
final; así mismo, todos los métodos que declara o define (como métodos
predeterminados) son públicos.
Otra diferencia importante es que una clase determinada puede heredar (extends) sólo una clase (no existe herencia múltiple), ya
sea abstracta o no; mientras que esa misma clase puede implementar cualquier cantidad
de interfaces.
Entonces ¿qué se debería utilizar: clases abstractas o interfaces? Una guía que podría ser útil es la siguiente (The Java Tutorials): considere utilizar clases abstractas si se enfrenta con alguna de estas situaciones:
- Desea compartir código entre varias clases estrechamente relacionadas (clases con un alto grado de acoplamiento).
- Espera que las clases que amplían su clase abstracta tengan muchos métodos o campos comunes, o requieran modificadores de acceso que no sean públicos (como protegido y privado).
- Desea declarar campos no static o no final. Esto le permite
definir métodos que pueden acceder y modificar el estado del objeto al
que pertenecen.
Por otro lado, considere usar interfaces si se enfrenta con alguna de estas otras situaciones:
- Espera que clases no necesariamente relacionadas implementen su interfaz. Por ejemplo, las interfaces Comparable y Cloneable del API son implementadas por muchas clases no relacionadas.
- Desea especificar el comportamiento de un tipo de datos en particular, pero no le preocupa quién implementa su comportamiento.
- Desea aprovechar la herencia múltiple de tipos.
Respecto a las interfaces, en general existe una serie muy amplia de situaciones en las que es importante que grupos distintos de programadores acepten un "contrato" que explique o determine cómo interactúa su software. Cada grupo debe poder escribir su código sin saber cómo está escrito el código del otro grupo. En términos generales puede decirse que las interfaces son tales contratos.
Con base en lo anterior y en estrecha relación con el Ejemplo de late binding (inicial de esta sección), considere ahora otros dos ejemplos que implementan de manera distinta la misma idea utilizando los conceptos y mecanismos descritos previamente. En algunas ocasiones y dependiendo de las habilidades, criterios y experiencia del programador, se puede utilizar el enfoque de clases abstractas e interfaces de manera intercambiable, pero también pueden ser utilizados de forma complementaria; los ejemplos que se presentan a continuación pretenden clarificar lo anterior. El lector interesado en aprender debe tomarse el tiempo que considere necesario para la comprensión de ambos ejemplos. Se sugiere seguir el orden propuesto:
- Ejemplo de figuras geométricas utilizando una clase abstracta.
- Ejemplo de figuras geométricas utilizando una clase abstracta y una interfaz.
No hay comentarios.:
Publicar un comentario