ich bin Javabeginner und mir wurde folgende Aufgabe gestellt (Main Methode ist vorgegeben).
Es sollen Klassen Person und PersonenList gebildet werden. Die Klasse PersonenList darf nicht von einer Collection erben und dort sollen 10 Objekte vom Typ "Person" gespeichert werden. Aus meiner Sicht bleibt daher nur noch Interface und Iteratoren. Ich komme aber bisher noch zu keiner Lösung. Es wäre schön, wenn mir jemand erklären kann, was ich in den Klassen Person und PersonenList definieren muss. Hier die main-Methode und meine beiden Klassen.
Java:
publicclassTestPersonenList{publicstaticvoidmain(String[] args){PersonenList list =newPersonenList();
list.add(newPerson("Peter","Braun"));
list.add(newPerson("Michael","Roth"));for(Person p : list){System.out.println(p);}}}
Ich habe PersonenList abgeleitet, damit ich die Attribute vorname und nachname erbe oder ist das falsch.
PersonenList sollte iterierbar sein? Mein Problem liegt ja darin Iterabel zu imlementieren. Wie mache ich das?
Ein gutes Beispiel wo Vererbung falsch verwendet wird. Du musst dir bei Vererbung die Frage stellen: "Ist eine PersonenListe eine Person?" Offensichtlich nein.
Die Liste muss Personen enthalten (genannt Komposition).
Also wäre eine Möglichkeit ein Array der Länge 10 vom Typ Person zu erstellen. Iterable zu implementieren habe ich aber auch noch nicht gemacht^^ (Das was pro2 schreibt, ist ja nur der erste Schritt^^ Du musst dann noch den Iterator selbst schreiben)
Edit: Dürfte auch nicht zu schwer sein... Aber man will ja nicht alles vorkauen
So ziemlich alles. Was ist denn deiner Meinung nach der Vorname einer Liste von Personen? Diese Vererbung ergibt schlicht und einfach überhaupt keinen Sinn. Genausowenig wie ein Autohaus ein Auto ist ist z.B. ein Aktenschrank mit den Personalakten eine Person.
importjava.util.Iterator;publicclassPersonenListimplementsIterable<Person>{Person[] personen =newPerson[10];publicPersonenList(){}publicvoidadd(Person p){// TODO: implement}@OverridepublicIteratoriterator(){returnnewPersonenIterator();}privateclassPersonenIteratorimplementsIterator<Person>{privatefinalint current =0;@OverridepublicbooleanhasNext(){// TODO: implementreturnfalse;}@OverridepublicPersonnext(){// TODO: implementreturnnull;}@Overridepublicvoidremove(){thrownewUnsupportedOperationException("method not implemented");}}}
Die Methoden musst du dann noch entsprechend implementieren.
EDIT:
Die Klasse PersonenList sollte natürlich ein Person und kein String Array haben.
das kann man alles viel einfacher haben. Das Stichwort, welches hier angebracht ist, heißt Delegate. Sprich, in der Klasse PersonenList hälst du dir eine Liste mit Personen-Objekten als Member. Weiterhin implementiert diese Klasse das Interface Iterable. Alle Methoden, die das Interface vorschreibt, werden direkt an die Membervariable weitergereicht oder anders ausgedrückt delegiert (daher der Name Delegate). Danach bist du fertig. Dann sparst du dir den Person-Iterator komplett.
Ohne den Code in einer IDE ausprobiert zu haben, müsste das ganze meiner Meinung nach ungefähr so aussehen:
Java:
publicclassPersonenListimplementsIterable<Person>{List<Person> personen =newArrayList<>();publicvoidadd(Person p){
personen.add(p);}@OverridepublicIteratoriterator(){return personen.iterator();}}
Mehr braucht man für diesen Fall nicht. Höchstens in der add Methode noch eine Abfrage, dass nicht mehr als 10 Personen gespeichert werden können. Du sprachst im ersten Posting von "da sollen 10 Personen gespeichert werden". Wenn dies eine Obergrenze sein soll, müsste dies in der add-Methode Berücksichtigung finden.
Vielen Dank für die Lösung Andreas, wäre auch vom Code her sehr einfach.
Leider meckert der Compiler über den Befehl mit der Meldung
The type List is not generic; it cannot be parameterized with arguments
<Person>
import java.awt.List ist eingebaut
Mußte den Befehl noch anpassen wegen jdk 1.6.
Der Befehl sieht jetzt so aus.
Code:
List<Person> personen = new ArrayList<Person>();
Ich dachte die Ausgabe würde mir die beiden Personen in Form Vorname und Nachnamen ausgeben.
Als Ausgabe erhalte ich jedoch leider nur:
Person@45bab50a
Wie bekomme ich die Ausgabe von Vorname und Nachname?
Ich bin erst wenige Tage im Javageschäft und daher fallen einem so einfache Sachen wie toString nicht immer ein. Man hat dann einfach ein Brett vor dem Kopf. Vielen Dank für die Vorschläge und Anregungen im Moment denke ich einfach noch zu kompliziert und man sieht den Wald vor lauter Bäumen nicht.
:bahnhof: :toll: