2012-03-31 16 views
7

Per i miei compiti, siamo stati incaricati di "dichiarare una schiera di quattro impiegati del college" normali ", tre Facoltà e sette studenti e chiedere all'utente di specificare il tipo di dati da inserire (C, F, S) o l'opzione per uscire (Q) .Se l'utente continua, accetta l'inserimento dati per la persona appropriata.Visualizza un messaggio di errore se l'utente immette più del numero specificato per ogni tipo di persona. un rapporto sullo schermo che elenca ciascun gruppo di persone sotto l'intestazione appropriata Se l'utente non ha inserito i dati per uno o più tipi di Persona durante una sessione, visualizza un messaggio appropriato sotto l'intestazione appropriata. "Ereditarietà in Core Java

Class   | Extends   | Variables 
-------------------------------------------------------- 
    Person   | None   | firstName, lastName, streetAddress, zipCode, phone 
    CollegeEmployee | Person   | ssn, salary,deptName 
    Faculty   | CollegeEmployee | tenure(boolean) 
    Student   | person   | GPA,major 

Dopo aver letto la Tutorials sulle successioni e traina un mucchio di discussioni eredità, credo di aver capito bene sulla carta, ma preferirei un certo input prima di entrare gomiti in profondità nel codice che non funziona. :)

sto definendo

Person[x] = new Student(); 

(o Faculty o CollegeEmployee).

La classe Person ha tutti i campi di immissione per un Person, e le sottoclassi hanno soltanto i dati aggiuntivi (ad esempio, major nel caso di Student).

Quando Creo la new Student(); i campi di input in entrambe le classi People e Student saranno disponibili perché Student estende People e le variabili aggiuntive definite in Student vengono aggiunti alla definizione di Person per questo esempio.

Quando arriva il momento di tirare i dati dalla matrice, Java lo vede come una matrice di Person, quindi ho bisogno di aggiungere la logica

if Person[x] instanceof Student (or `Faculty` or `CollegeEmployee`) 

per eseguire le azioni appropriate per il tipo di Person. La mia sensazione è che il instanceof stia agendo per sovrascrivere (in questo caso per aggiungere a) ciò che Java conosce sulla classe Person sul lato di uscita.

Mi manca qualche comprensione critica di questo?

+7

Se è necessario utilizzare 'instanceof', c'è una buona possibilità che tu stia facendo qualcosa di sbagliato ... –

+4

Oppure i vincoli di assegnazione sono un po 'spenti. Potresti voler pubblicare le esatte istruzioni di assegnazione. –

+1

La persona è sempre un esempio pericoloso per l'ereditarietà. Quando ero uno studente ero contemporaneamente un impiegato universitario. Meglio che con l'ereditarietà (non multipla) una tale situazione può essere modellata applicando qualcosa come "Ruoli" a un'istanza di Persona. – nansen

risposta

3

Non c'è solo ereditarietà, ma polimorfismo: basta inserire il codice necessario per immettere e convalidare i dati dell'oggetto nel metodo dell'oggetto (ad esempio: inputMyData() sovrascrive il metodo di base in persona, possibilmente chiamando il metodo della superclasse) - in questo modo è possibile evitare instanceof e casting.

1

In generale, è necessario evitare instanceof. La cosa semplice da fare in questo caso sembra essere quella di creare tre array: uno CollegeEmployee[], uno Faculty[] e uno Student[], piuttosto che raggrupparli tutti in uno Person[] e ordinarli in seguito.

risposta originale di seguito:

Se io sto capendo quello che stai cercando di fare in modo corretto, instanceof non è necessario.

Se si scrive qualcosa di simile

Person bob = new Student(); 
bob.someAction(); 

dove someAction è un metodo definito per Person e sovrascritto da Student, allora Java chiamerà la versione Student, anche se il metodo viene chiamato su una variabile Person.L'invio dinamico garantisce che le chiamate al metodo risolvano sempre la versione del metodo implementato dal tipo di oggetto effettivo, non il tipo di variabile.

Si noti che questo funziona solo se someAction è definito come un metodo astratto o concreto da Person. Se è presentato per la prima volta da Student, allora devi fare un cast esplicito.

+2

l'assegnazione specifica in modo specifico per creare * un array * o uno e un solo array. Dovresti ritirare la tua raccomandazione per quattro array poiché questo va contro le istruzioni (e ostacolerà la dimostrazione di polimorfismo). –

+0

E 'questo che significa "dichiarare una schiera di quattro" normali "impiegati del college, tre docenti e sette studenti"? Come faresti a farlo? – Taymon

+1

'Persona [] persone = nuova Persona [14];' –

3

Prima di tutto l'indirizzo dovrebbe essere piuttosto un oggetto separato.

In secondo luogo, Student non può essere una (in) diretto discendente di Person, come studente è un/lavoro-ruolo civico-stato (è ancora difficile da definire) e persona è uno synonyme per l'essere umano, che d'altra parte è una specie In altre parole, non si può dire che lo studente è un caso speciale di persona (inheritance), ma si può dire che quella persona ha uno stato civico dello studente (composition).

Se date un'occhiata alle proprietà dei vostri corsi noterete anche che non rappresentano la stessa cosa. Ogni oggetto dovrebbe concentrarsi su una cosa (single responsibility principle), mentre l'oggetto Person definisce nome e cognome, età ecc. (Proprietà relative alla persona) e CollegeEmployee definisce lo stipendio e il nome del reparto (proprietà relative al lavoro). Proprietà totalmente indipendenti.

In poche parole, una persona è un oggetto davvero complesso ed è un esempio orribile per una persona che sta cercando di comprendere i principi del design OO.

+1

ha convenuto che 'Persona' è un cattivo esempio, l'indirizzo dovrebbe essere un oggetto separato e che le proprietà dell'oggetto non hanno senso. Ma come ho detto, non disegno i compiti, mi limito ad essere sconcertato dai parametri. Penso che sia per questo che sto avendo così tante domande in questo semestre. :) – dwwilson66