2010-07-13 11 views
5

Da MasterExam:java IS-Una domanda rapporto esame confusione

Quali affermazioni sono vere? (Scegliere tutti gli applicabili)

A. è una relazione sempre basata sull'eredità
B. è una relazione sempre basata sulle variabili di istanza
C. è-una relazione richiede sempre a almeno due tipi di classe
D. è una relazione sempre basata sul polimorfismo
E. è-una relazione sono sempre strettamente accoppiato

risposte corrette: A, C, D

non vedo come qualsiasi A, C o D sono corrette.

Un oggetto Oggetto IS-A Oggetto. Una stringa IS-A String object. Esiste un solo tipo di classe in ognuna di queste affermazioni e non si applica alcuna ereditarietà o polimorfismo.

La mia motivazione non è corretta o le risposte sono errate?

+1

Il contesto in cui appare indica una relazione tra le classi? –

+0

Quello che ho inserito è l'intera domanda, dall'inizio alla fine. – CodeClimber

+0

@ck - grazie per l'utile contributo – CodeClimber

risposta

1

Il razionale è leggermente disattivato, poiché questa relazione si applica alle classi , non agli oggetti.

Una stringa IS-A oggetto dal String eredita da Object. Allo stesso modo un FileOutputStream IS-A OutputStream IS-A Object.

IS-A è una relazione tra classi, non tra classi e oggetti.

+0

Puoi elaborare? Non vedo la rilevanza della distinzione tra classi e oggetti. A FileOutputStream IS-A OutputStream IS-A Object - ereditarietà. Anche un FileOutputStream IS-A FileOutputStream - nessuna ereditarietà. Risposta A afferma: "è una relazione che si basa SEMPRE sull'eredità". – CodeClimber

+1

@dairemac: una relazione 'IS-A' è modellata tra entità in un diagramma ER, ad esempio - tali relazioni * sempre * diventano ereditari quando ci si sposta ad es. UML. Non disegnare cerchi in quel grafico e dichiarare tutto una sottoclasse di se stesso. Per quanto riguarda il principio di sostituzione di Liskov, può essere logico trattarlo in questo modo quando si programma, ma nessuna classe eredita da se stessa. Quindi "Foo IS-A Foo" è puramente privo di senso. Inoltre, la distinzione tra classi e oggetti dovrebbe essere stata resa abbastanza chiara all'inizio delle tue classi OOP. – Joey

+0

Grazie per la risposta Johannes. Stai equipaggiando l'IS-A con l'ereditarietà in cui avrei equiparato l'IS-A con qualsiasi cosa che ritorna vera usando la parola chiave instanceof. Forse hai ragione. Sono, ovviamente, ben consapevole della distinzione tra classi e oggetti - stavo semplicemente interrogando la rilevanza della distinzione in questa query. – CodeClimber

4

"Rapporto" indica una relazione tra due classi. Una relazione is-a è un tipo di relazione che utilizza l'ereditarietà (al contrario di ad esempio has-a, che utilizza la composizione). Ad esempio, una stringa è un oggetto. Una classe non può ereditare da sé, il che implica C. Come nota a margine, una classe potrebbe avere composizione (ha-a) con se stessa. Per esempio. una persona potrebbe avere un'altra persona come campo madre.

Ogni volta che si ha ereditarietà, è possibile utilizzare un'istanza della sottoclasse come istanza della superclasse. Questo è polimorfismo, il che significa che anche D ha ragione.

+0

Forse hai ragione, la parola importante qui è "relazione" che suggerisce due classi diverse. Non sono ancora convinto al 100%, ma segnerò questa come risposta accettata. Diciamo quindi: Un cane cane IS-A - vero. A Dog IS-A Animal - true. Un cane ha una relazione IS-A con Cane - falso. Un cane ha una relazione IS-A con Animale - vero. Per inciso, i miei commenti appaiono senza interruzioni di linea che ho inserito, perché? – CodeClimber

+0

@dairemac - relativo alla interruzione di riga dei commenti, è proprio così ... – cjk

+0

Come indicato di seguito - Sto cambiando la mia comprensione dell'IS-A. Precedentemente avrei identificato una relazione IS-A con la parola chiave "instanceof", ad esempio if (d istanza di Dog), quindi il tipo di classe IS-A Dog. Ora sto dicendo che questo non è necessariamente il caso. Ora equiparerò l'IS-A all'eredità. In precedenza avrei detto che "Dog IS-A Dog" era vero, ma d'ora in poi dirò che è falso. Grazie per tutti i feedback. – CodeClimber

1

avete bisogno di vedere un po 'diverso:

  • Un gatto è-un animale
  • Una macchina ha-un motore
  • String is-a oggetto
  • Una stringa ha un array di caratteri

Prova a vederlo in questo modo, dovrebbe diventare più chiaro ora.

+0

Non sono convinto di essere onesto. 1. Un gatto è un animale. 2. Un gatto è un gatto. L'opzione A afferma "è una relazione che si basa SEMPRE sull'ereditarietà". L'ereditarietà si applica in 1 ma non in 2. – CodeClimber

+0

Per la composizione, questo è posible: un padre ** ha un padre **. Ma per ereditarietà (is-a), consideriamo solo tipi diversi. ** is-a ** con gli stessi tipi è sempre vero e forse, in theorie, ogni tipo si eredita da solo. –

+0

"in theorie, ogni tipo si eredita da solo" - errato secondo me. "is-a con gli stessi tipi è sempre vero" - questo è esattamente quello che sto dicendo! – CodeClimber

0

Siamo spiacenti, il tuo razionale è sbagliato. Stanno parlando di due classi diverse. Ad esempio, una stringa è un oggetto.

3

A. Che una stringa è una stringa è ... una tautologia, considerata ovvia. Ma guardando la documentazione dell'API, si scopre che uno java.lang.String è anche un java.lang.Object. Infatti, tutte le classi Java ereditano da java.lang.Object. Essi ereditano le proprietà di base dell'oggetto e ne aggiungono altri. Ecco di cosa si tratta - una relazione è tutto.

C. Ancora una volta, la tautologia di qualsiasi oggetto stesso è di interesse per i buddisti Zen ma non per i progettisti di linguaggi e altri scienziati informatici. Quindi per avere una relazione "è-a", hai bisogno di due classi distinte.

D. Non sono così sicuro qui. Se mi venisse chiesto, direi che il polimorfismo dipende dalla relazione "è-a", non viceversa.

+0

I buddisti zen sono più interessati a un oggetto _not_ being itself :-) –

+0

Ho dovuto cercare "tautologia" nel dizionario! Una definizione è "un'affermazione SEMPRE VERA". La domanda d'esame chiede quali risposte sono VERO e tutte le risposte fornite includono SEMPRE la parola. Come scienziato informatico, uso la logica e la logica che se qualcosa è ovviamente vero, allora è ancora vero! Come indicato in una risposta diversa qui, forse la parola chiave qui è "relazione" che implica due classi diverse ma non è chiara al 100%. Grazie per il feedback. – CodeClimber

+0

Ancora, l'informatica non è filosofia. Che un gatto sia un gatto non è rilevante/interessante/significativo dal punto di vista del software. O ha dichiarato in modo diverso: avere ragione non ti aiuterà se il tuo prof decide di non accettare la tua risposta. –

1

Penso che i punti A & C siano abbastanza chiari per ora ... per quanto riguarda D. anche se può essere tecnicamente possibile estendere una classe senza comportamento o proprietà di istanza .. (vuoto o forse solo con elementi statici). ..ma in linea di principio questo tipo di sconfigge lo scopo di "estendere" le classi in quanto si desidera ereditare comportamento/funzionalità dalle classi più in alto nell'albero di ereditarietà. Quindi, direi che l'opzione D. è corretta (quasi) :) (se non stiamo andando troppo tecnico) .btw questa può essere una discussione interessante.