2012-03-31 18 views
7

Für meine Hausaufgaben, wir wurden beauftragt mit "erklären eine Reihe von vier" regulären "College-Mitarbeiter, drei Fakultät und sieben Studenten. Fordern Sie den Benutzer anzugeben, welche Art von Daten eingegeben werden (C, F, S) oder die Option zum Beenden (Q) .Während der Benutzer fortfährt, akzeptieren Sie die Dateneingabe für die entsprechende Person. Zeigen Sie eine Fehlermeldung an, wenn der Benutzer mehr als die angegebene Nummer für jeden Personentyp eingibt einen Bericht auf dem Bildschirm, der jede Personengruppe unter der entsprechenden Überschrift auflistet Wenn der Benutzer während einer Sitzung keine Daten für einen oder mehrere Personentypen eingegeben hat, wird eine entsprechende Nachricht unter der entsprechenden Überschrift angezeigt.Vererbung 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 

Nach dem Tutorials auf Vererbung zu lesen und eine Reihe von Vererbungs Diskussionen Trolling, ich glaube, ich es richtig auf dem Papier haben, würde aber eine Eingabe bevorzugen, bevor ich die Ellbogen tief in Code, der nicht funktioniert. :)

ich definieren

Person[x] = new Student(); 

(oder Faculty oder CollegeEmployee).

Die Person Klasse hat alle Eingabefelder für ein Person, und die Unterklassen haben nur die zusätzlichen Daten (beispielsweise major im Fall von Student).

Wenn ich die new Student(); die Eingabefelder sowohl in der People und Student Klassen erstellen, wird mir zur Verfügung stehen, weil StudentPeople erstreckt und die zusätzlichen Variablen in Student definiert sind, auf die Definition von Person für diese Instanz angehängt.

Wenn es darum geht, Daten aus dem Array zu ziehen, sieht Java es als ein Array von Person, also muss ich Logik hinzufügen

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

die entsprechenden Aktionen für die Art von Person auszuführen. Mein Gefühl ist, dass die instanceof handelt, um zu überschreiben (in diesem Fall, an), was Java über die Person Klasse auf der Ausgabeseite weiß.

Fehle ich irgendein kritisches Verständnis davon?

+7

Wenn Sie 'instanceof' verwenden müssen, gibt es eine gute Chance, dass Sie etwas falsch machen ... –

+4

Oder die Zuordnung Einschränkungen sind ein bisschen aus. Möglicherweise möchten Sie die genauen Zuweisungsanweisungen veröffentlichen. –

+1

Person ist immer ein gefährliches Beispiel für die Vererbung. Als ich Student war, war ich zur gleichen Zeit College-Mitarbeiter. Besser als bei der (nicht multiplen) Vererbung kann eine solche Situation modelliert werden, indem man etwas wie "Rollen" auf eine Personeninstanz anwendet. – nansen

Antwort

3

Es gibt nicht nur Vererbung, sondern Polymorphie - einfach Code eingeben, um Objektdaten in Objektmethode einzugeben und zu validieren (zB: inputMyData() überschreibt Basismethode persönlich, möglicherweise Methode der Oberklasse) - so können Sie vermeide instanceof und casting.

1

Im Allgemeinen ist instanceof zu vermeiden. Die einfache Sache in diesem Fall zu tun scheint zu sein, drei Arrays zu machen: ein CollegeEmployee[], ein Faculty[], und ein Student[], anstatt sie alle in einem Person[] zu verklumpen und sie später aussortieren.

Ursprüngliche Antwort unten:

Wenn ich zu verstehen, was Sie versuchen, richtig zu tun, ist instanceof nicht erforderlich.

Wenn Sie so etwas wie

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

schreiben, wo someAction ein Verfahren zum Person und außer Kraft gesetzt durch Student definiert ist, dann wird Java rufen Sie die Student Version, auch wenn das Verfahren auf einem Person Variable aufgerufen wird.Die dynamische Verteilung stellt sicher, dass Methodenaufrufe immer in die Version der Methode aufgelöst werden, die vom tatsächlichen Objekttyp und nicht vom Variablentyp implementiert wird.

Beachten Sie, dass dies nur funktioniert, wenn someAction als eine abstrakte oder konkrete Methode von Person definiert ist. Wenn es zum ersten Mal von Student eingeführt wird, dann müssen Sie eine explizite Umwandlung vornehmen.

+2

Die Zuweisung besagt ausdrücklich, dass * ein Array * oder nur ein Array erstellt werden soll. Sie sollten Ihre Empfehlung für vier Arrays zurückziehen, da dies den Anweisungen widerspricht (und die Demonstration von Polymorphismus behindern wird). –

+0

Ist das, was "eine Reihe von vier" regelmäßige "College-Mitarbeiter, drei Fakultät und sieben Studenten" erklären bedeutet? Wie würdest du das überhaupt machen? – Taymon

+1

'Person [] people = neue Person [14];' –

3

Zunächst sollte die Adresse eher ein separates Objekt sein.

Zweitens Student kann kein (in) direkter Nachkommen von Person sein, als Student eine Bürger-Status/Job-Rolle (es ist auch schwer zu definieren) und Mensch ist ein Synonym für Menschen, die auf der anderen Seite ist eine Spezies. Mit anderen Worten können Sie nicht sagen, dass Student ist ein (inheritance) Sonderfall der Person, aber Sie können sagen, dass Person hat einen (composition) Civic-Status des Schülers.

Wenn Sie sich die Eigenschaften Ihrer Klassen ansehen, werden Sie auch bemerken, dass sie nicht dasselbe darstellen. Jedes Objekt sollte sich auf eine Sache konzentrieren (single responsibility principle), während Person Objekt den Vor- und Nachnamen, das Alter usw. (personenbezogene Eigenschaften) definiert und CollegeEmployee das Gehalt und den Namen der Abteilung (berufsbezogene Eigenschaften) definiert. Völlig nicht verwandte Eigenschaften.

Kurz gesagt, eine Person ist ein wirklich komplexes Objekt und es ist ein schreckliches Beispiel für eine Person, die versucht, die Prinzipien des OO-Designs zu verstehen.

+1

stimmte zu, dass 'Person' ein schlechtes Beispiel ist, Adresse ein separates Objekt sein sollte und dass die Objekteigenschaften keinen Sinn ergeben. Aber wie gesagt, ich entwerfe die Aufgaben nicht, ich werde nur durch die Parameter verblüfft. Ich denke, deshalb habe ich dieses Semester so viele Fragen. :) – dwwilson66