2010-02-08 18 views
48

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.HAS-A, terminología IS-A en lenguaje orientado a objetos

+0

¿Qué libro estaba leyendo? –

+0

"Is-a" es reutilización de código por herencia, "has-a" - por delegación. –

Respuesta

14

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 lo compara con una clase en este caso.

49

A Car has-a Wheel.

A Sparrow is-a Bird.

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

+0

¿Tienen que tener una relación real? Quiero decir que tengo una clase Doors que extiende la clase Home, pero una Door no es una Home prácticamente, pero extiende la clase Home programmatically. –

+3

@ BurakKarakuş: Entonces puede ser incorrecto. Isa/Hasa es una pregunta que debe hacerse para decidir si la herencia es la respuesta correcta. Tal vez su puerta debe 'tener 'un hogar, no' ser un' hogar. –

6

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

IS-A significa que puede tener una clase que "es 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 una "HAS-A" es más apropiada. 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 apropiado .

+0

Y, sin embargo, incluso cosas como 'Estudiante ES-Una persona' tienden a ser muy problemáticos, por ejemplo, en los casos en que un Estudiante pasa a ser profesor. En general, prefiero no atacar los problemas de OO en función de la estructura de las cosas, sino más bien de sus comportamientos y de cómo transforman los datos. Casi nunca uso la herencia para ese tipo de trabajo estructural, solo para valores (un Nombre es un tipo de Cadena), o para reutilizar el código de la plantilla. – kyoryu

4

Es un = Tipo especial de, p. El coche es un tipo especial de vehículo.

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

119

Esta es una programación orientada a objetos y terminología UML, no específica de Java. En realidad, hay tres casos se debe 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).

+9

+1 para la distinción entre composición y agregación. Otra forma de decir es la agregación es una composición de forma suelta. – fastcodejava

+0

Creo que hay una relación "faltante": "colabora con". Eso parece alinearse relativamente bien con su tercera definición.La principal diferencia que veo entre las definiciones 2 y 3 es una de propiedad. – kyoryu

+2

4. A House ** utiliza un ** proveedor de internet (asociación). –

2

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.

+1

Para entidades mutables, 'uses-a' es probablemente la relación más importante, y la que menos piensa. – kyoryu

3

IS-A, HAS-A etc. no son realmente muy OO. En cambio, Liskov substitution principle es OO.

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

Robert C. Martin: La palabra se arrastró "ISA" en nuestro vocabulario y por cierto que es una palabra de ISA, que se introdujo en nuestro vocabulario a través de una ruta tortuosa 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 declaración 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 compilarlo. 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 compilarse porque tiene un pensamiento infinito. Tiene perfecto sentido en inglés, no tiene ningún sentido en absoluto en el software.

1

"IS A": Establece 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 interfaz para definir la capacidad.

Ejemplo:

perro IS A Animal. Es TIENE una capacidad de para aprender.

Hombre IS Not A Animal. Él TIENE una capacidad de para aprender, pensar, escalar y aplicar.

0

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" utiliza la herencia "tiene un" utiliza portacontenedores

1

Los nombres implican más o menos todo.

un IS-Una clase puede ser pensado como referencia especializado a una instancia de otra clase que hereda todos sus atributos.

Si existe una clase llamada Vehículo. Entonces, cualquier tipo del vehículo puede heredar los atributos de esta superclase. 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, un HAS-Una clase 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 Clase de nuevo el vehículo , una clase controlador sería considerado una agregación porque el clase controlador puede existir como una entidad independiente, incluso si el clase vehículo deja de existir.

Mientras que un motor clase no puede existir si un clase vehículo es inexistente, debido a que el motor no puede existir fuera del alcance de la vehículo.

enter image description here

Cuestiones relacionadas