Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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:
public class TestPersonenList {
public static void main(String[] args) {
PersonenList list = new PersonenList();
list.add(new Person("Peter", "Braun"));
list.add(new Person("Michael", "Roth"));
for(Person p : list) {
System.out.println(p);
}
}
}
Java:
public class Person {
public String vorname;
public String nachname;
public Person(){
}
public Person(String vorname, String nachname){
this.vorname = vorname;
this.nachname = nachname;
}
public String getVorname() {
return vorname;
}
public void setVorname(String vorname) {
this.vorname = vorname;
}
public String getNachname() {
return nachname;
}
public void setNachname(String nachname) {
this.nachname = nachname;
}
}
Java:
import java.util.Iterator;
public class PersonenList extends Person {
String[] listen = new String[10];
public PersonenList(){
}
public PersonenList(String vorname, String nachname){
super(vorname, nachname);
}
public void add (Person person){
listen.add(person);
}
}
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.
import java.util.Iterator;
public class PersonenList implements Iterable<Person> {
Person[] personen = new Person[10];
public PersonenList(){
}
public void add(Person p) {
// TODO: implement
}
@Override
public Iterator iterator() {
return new PersonenIterator();
}
private class PersonenIterator implements Iterator<Person> {
private final int current = 0;
@Override
public boolean hasNext() {
// TODO: implement
return false;
}
@Override
public Person next() {
// TODO: implement
return null;
}
@Override
public void remove() {
throw new UnsupportedOperationException("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:
public class PersonenList implements Iterable<Person> {
List<Person> personen = new ArrayList<>();
public void add(Person p) {
personen.add(p);
}
@Override
public Iterator iterator() {
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: