Terminología HAS-A, IS-A en lenguaje orientado a objetos

Estaba leyendo el libro y tenía los términos “HAS-A” e “IS-A” en él. Alguien sabe lo que significan específicamente? Intenté buscar en el libro, pero el libro tiene 600 páginas.

Esta es una progtwigción orientada a objetos y terminología UML, no específica de Java. En realidad, hay tres casos que debes tener en cuenta:

  1. Una casa es un edificio (herencia);
  2. Una casa tiene una habitación (composición);
  3. Una casa tiene un ocupante (agregación).

La diferencia entre (2) y (3) es sutil pero importante de diferenciar. Juntos son formas de asociación . ¿Cual es la diferencia? La composición implica que el objeto hijo no puede vivir fuera del contexto del padre (destruye la casa y las habitaciones desaparecen) mientras que la agregación implica que el niño puede existir por sí mismo (destruye la casa y el ocupante se va a otra parte).

Un Car tiene una Wheel .

Un Sparrow es … un Bird .

Académicamente, los términos se usan para decidir entre composición y herencia.

Has-a significa que la clase en cuestión ‘tiene’ un campo de un tipo.

Is-a significa que la Clase se extiende desde una superclase o implementa una interfaz. El operador instanceof devolvería true si se compara con una clase en este caso.

Esto no es específico de Java, es específico de OO.

IS-A significa que puede tener una clase que “es un” algo. Como una persona estudiante “IS-A”. Esto se usa para describir un objeto que es una subclase de otro.

A veces no hay una relación IS-A entre dos clases, pero un “HAS-A” es más apropiado. Ejemplo, una silla “HAS-A” pierna. o varios esto se llama agregación, en oposición a la herencia.

No voy a entrar en los detalles de cuándo usar cada uno, porque depende de cómo se usan las clases e incluso si se sabe que hay mucho que considerar, una nueva pregunta para un caso específico sería más apropiada.

Es un = tipo especial de, por ejemplo, el coche es un tipo especial de vehículo.

Tiene a = Tiene algo físicamente, por ejemplo, el automóvil tiene un motor.

ES A “: establece una relación entre objetos relacionados. Puede usar herencia para establecer la relación.

“TIENE A” : define una capacidad para objetos posiblemente no relacionados. Puede usar la interfaz para definir la capacidad.

Ejemplo:

El perro es un animal TIENE una capacidad para aprender.

El hombre no es un animal. Él TIENE una capacidad para aprender, pensar, escalar y aplicar.

IS-A, HAS-A, etc. no son realmente muy OO. En cambio, el principio de sustitución de Liskov es OO.

El tío Bob arroja algo de luz sobre la historia de IS-A en http://www.hanselminutes.com/default.aspx?showID=163

Robert C. Martin: La palabra “ISA” se deslizó en nuestro vocabulario y por cierto esa es una palabra ISA, se deslizó en nuestro vocabulario a través de una ruta indirecta y se volvió muy importante en círculos orientados a objetos, pero no comenzó de esa manera . Se deslizó en los 80 a través de la multitud de AI que había creado estas maravillosas redes de conocimiento, puede recordar esto, todo el bombo sobre la Inteligencia Artificial a finales de los 80, principios de los 90, y luego creó estas estructuras que caminarían las redes de conocimiento de estos motores de inferencia y las relaciones entre las entidades y las redes de conocimiento con cosas como, es como a, sabe como a, huele como un ISA, todas estas relaciones -A es como, tiene una a, y cuando la multitud de AI pierde su financiación, y todas esas campañas de recaudación de fondos, miraron y dijeron: “Ah, hay otras cosas, es genial. Mira, hay relaciones como las que tienen y siguen, es muy similar, deberíamos mudarnos. ” Y lo hicieron y el vocabulario cambió. Eso es interesante, también es un poco desafortunado porque la herencia no es ISA. Herencia, si se mira con un ojo muy cansado, la herencia es la statement de métodos y variables en un subámbito y no tiene nada que ver con ISA, y la noción de ISA puede ser muy confusa. Ejemplo simple, un número entero es un número real y un número real es un número complejo. Podrías dibujar eso en tu UML, sería muy simple con toda la herencia allí y demás, pero piensa en intentar comstackrlo. Un número entero que esperaríamos sería de 16 o quizás 64 bits, pero si se derivara del número real, un número real tiene dos enteros, una mantisa y unas características, el exponente y ellos usaron, implicaron puntos binarios dentro de ellos para hacer este número de coma flotante. El número de coma flotante, el número real, deriva de complejo pero el complejo tiene dos números reales, el imaginario y la parte real. Si tuviera que pensar en escribir eso en C ++ o en Java, escribiría una estructura que no podría comstackrse porque tiene un pensamiento infinito. Tiene perfecto sentido en inglés, no tiene ningún sentido en absoluto en el software.

Los nombres implican casi todo.

Se puede pensar que una clase IS-A es una referencia especializada a una instancia de otra clase que hereda todos sus atributos.

Si existe una clase llamada Vehículo . Entonces, cualquier tipo de vehículo puede heredar los atributos de esta súper clase. Por ejemplo, Police Car heredará todos los atributos de Vehicle porque es una especialización de este último.

enter image description here

Por otro lado, una clase HAS-A tiene una referencia a otra clase o una instancia de otra clase. En otras palabras, comparte una asociación con otra clase. Hay dos tipos de clases HAS-A, agregación , lo que significa que la clase puede existir de forma independiente, y composición , lo que significa que la clase solo puede existir junto a la que comparte una asociación.

Es importante saber cuándo clasificar un objeto como una clase de composición o simplemente como un atributo de otra clase.

Tomando nuevamente la clase de vehículo , una clase de controlador se consideraría una agregación porque la clase de controlador puede existir como una entidad independiente incluso si la clase de vehículo deja de existir.

Mientras que una clase de motor no puede existir si una clase de vehículo no existe, porque el motor no puede existir fuera del scope del vehículo .

enter image description here

como señala Cletus, is-a es diferente. pero ten cuidado con has-a. esto puede significar composición (responsabilidad de por vida), agregación (parte de algo), o simplemente usa-a (tiene una referencia a, sabe cómo construir uno o encontrar uno). este último es solo una asociación.

Si desarrolla una Clase de Colección llamada “Escuela”. Tendría “maestros” y “estudiantes” en la escuela. Usted desarrolla una clase de “persona” y tanto “estudiante” como “maestro” heredarían de la clase “Persona” ya que ambos son – “es una” persona. Tanto el Estudiante como el Maestro tienen cada uno un cumpleaños. Debería crear una “Clase de fecha” ya que tanto el maestro como el alumno “tienen” o “tienen un” cumpleaños dentro de la “Clase de persona”. Esto es “portacontenedores” En resumen “es una persona” usa la herencia “tiene un” portacontenedores de usos