2010-07-13 8 views
5

De MasterExam:Java ES-Un examen de la relación pregunta confusión

Qué afirmaciones son ciertas? (Elija todos los que se apliquen)

A. es una relación siempre confiar en herencia
. es una relación siempre confiar en variables de instancia
C. es-una relación siempre requiere en menos dos tipos de clase
D. es una relación siempre confiar en polimorfismo
E. -es una relación siempre se estrechamente unida

respuestas correctas: A, C, D

no veo cómo cualquiera de A, C o D son correctas.

Objeto Objeto IS-A Objeto. Un objeto String IS-A String. Solo hay un tipo de clase en cada una de estas afirmaciones y no se aplica ninguna herencia o polimorfismo.

¿Está equivocado mi razonamiento o las respuestas son incorrectas?

+1

¿El contexto en el que aparece esto especifica una relación entre clases? –

+0

Lo que he ingresado es toda la pregunta, de principio a fin. – CodeClimber

+0

@ck - gracias por esa valiosa contribución – CodeClimber

Respuesta

1

Su fundamento es levemente apagado, ya que esta relación se aplica a las clases , no a los objetos.

Un objeto IS-A de cadena desde String hereda de Object. Del mismo modo, un FileOutputStream IS-A OutputStream IS-A Object.

IS-A es una relación entre clases, no entre clases y objetos.

+0

¿Puedes elaborar? No veo la relevancia de la distinción entre clases y objetos. A FileOutputStream IS-A OutputStream IS-A Objeto - herencia. También un FileOutputStream IS-A FileOutputStream - sin herencia. Respuesta A declara: "es una relación SIEMPRE depende de la herencia". – CodeClimber

+1

@dairemac: una relación 'IS-A 'se modela entre entidades en un diagrama de ER, por ejemplo, esas relaciones * siempre * se convierten en herencia cuando se mueve a, p. UML. No dibujar círculos en ese gráfico y declarar todo una subclase de sí mismo. Con respecto al principio de sustitución de Liskov, puede tener sentido tratarlo de esa manera cuando se programa, pero ninguna clase se hereda de sí misma. Por lo tanto »Foo IS-A Foo« es puramente absurdo. Además, la distinción entre clases y objetos debería haber quedado bastante clara al comienzo de las clases de OOP. – Joey

+0

Gracias por la respuesta Johannes. Están equiparando IS-A con herencia donde yo habría equiparado IS-A con cualquier cosa que devuelva verdadero usando la palabra clave instanceof. Quizás tengas razón. Naturalmente, soy muy consciente de la distinción entre clases y objetos; me limité a consultar la relevancia de la distinción para esta consulta. – CodeClimber

4

"Relación" se refiere a una relación entre dos clases. Una relación is-a es un tipo de relación que usa la herencia (a diferencia de, por ejemplo, has-a, que usa la composición). Por ejemplo, una Cadena es un Objeto. Una clase no puede heredar de sí misma, lo que implica C. Como nota al margen, una clase podría tener composición (has-a) consigo misma. P.ej. una Persona podría tener otra Persona como un campo de madre.

En cualquier momento que tenga herencia, una instancia de la subclase se puede usar como una instancia de la superclase. Eso es polimorfismo, lo que significa que D también es correcto.

+0

Tal vez tengas razón, la palabra importante aquí es "relación", que sugiere dos clases diferentes. Todavía no estoy 100% convencido pero voy a marcar esto como la respuesta aceptada. Estamos por lo tanto diciendo: Un perro IS-A Dog - verdadero. Un perro IS-A Animal - cierto. Un perro tiene una relación IS-A con Dog - falso. Un perro tiene una relación IS-A con Animal - cierto. Como un lado, mis comentarios están apareciendo sin los saltos de línea que he introducido, ¿por qué? – CodeClimber

+0

@dairemac - relacionado con el salto de línea de comentarios, así es como es ... – cjk

+0

Como se indica a continuación, estoy cambiando mi comprensión de IS-A. Anteriormente, habría equiparado una relación IS-A con la palabra clave "instanceof", es decir, si (d instancia de Dog), a continuación, tipo de clase s IS-A Dog. Ahora estoy diciendo que este no es necesariamente el caso. Ahora equipararé IS-A con herencia. Anteriormente habría dicho que "Dog IS-A Dog" era cierto, pero a partir de ahora diré que eso es falso. Gracias por todos los comentarios. – CodeClimber

1

necesita ver un poco diferente:

  • Un gato es-un animal
  • Un coche tiene-un motor
  • Una cadena es-un objeto
  • A String has-a matriz de caracteres

Trate de verlo de esa manera, debería ser más claro ahora.

+0

No estoy convencido para ser honesto. 1. Un gato es un animal. 2. Un gato es un gato. La opción A establece "es una relación SIEMPRE depende de la herencia". La herencia se aplica en 1 pero no en 2. – CodeClimber

+0

Para la composición, esto es posible: un padre ** tiene-un ** padre. Pero para la herencia (is-a), solo consideramos diferentes tipos. ** is-a ** con los mismos tipos es siempre cierto y, tal vez, en teoría, cada tipo se hereda a sí mismo. –

+0

"en teoría, cada tipo se hereda a sí mismo" - incorrecto en mi opinión. "is-a con los mismos tipos es siempre cierto" - ¡eso es exactamente lo que estoy diciendo! – CodeClimber

0

Lo siento, su racionalidad es incorrecta. Están hablando de dos clases diferentes. Por ejemplo, una cadena es un objeto.

3

A. Que una Cadena es una Cadena es ... una tautología, considerada obvia. Pero mirando la documentación de la API, encontrará que un java.lang.String también es un java.lang.Object. De hecho, todas las clases de Java heredan de java.lang.Object. Heredan las propiedades básicas de Object y agregan otras propias. De eso se trata, una relación.

C. Una vez más, la tautología acerca de cualquier objeto en sí es de interés para los budistas Zen, pero no para los diseñadores de idiomas y otros científicos informáticos. Entonces para tener una relación "es-a", necesitas dos clases distintas.

D. No estoy tan seguro aquí. Si me preguntaran, diría que el polimorfismo depende de la relación "es-a", y no al revés.

+0

Los budistas Zen están más interesados ​​en un objeto _no_ en sí mismo :-) –

+0

¡Tenía que buscar "tautología" en el diccionario! Una definición es "una declaración que SIEMPRE es verdadera". La pregunta del examen pregunta qué respuestas son VERDADERAS y todas las respuestas suministradas incluyen la palabra SIEMPRE. Como científico de la computación, uso la lógica y la lógica dicta que si algo es obviamente cierto, ¡entonces sigue siendo cierto! Como se menciona en una respuesta diferente aquí, tal vez la palabra clave aquí es "relación", lo que implica dos clases diferentes pero no está 100% claro. Gracias por la respuesta. – CodeClimber

+0

Aún así, la informática no es filosofía. Que un gato es un gato no es relevante/interesante/significativo desde el punto de vista del software. O dicho de otra manera: tener la razón no te ayudará si tu profesor decide no aceptar tu respuesta. –

1

Creo que los puntos A & C son bastante claros en este momento ... con respecto a D.though, puede ser técnicamente posible extender una clase sin comportamiento o propiedad de instancia ... (en blanco o tal vez solo con elementos estáticos). ... pero eso en principio es una especie de obstáculo al propósito de "extender" las clases, ya que desea heredar el comportamiento/funcionalidad de las clases que se encuentran más arriba en el árbol de herencia. Entonces, diría que la opción D. es correcta (casi) :) (si no vamos demasiado técnicos) .btw esto puede ser una discusión interesante.