Interface und Abstrakte Klassen

Marcel0019

Mitglied
Hallo zusammen,

ich brauche mal Hilfe, weil ich hier total auf dem Schlauch stehe 🙁
Es geht um folgende Problemstellung (siehe UML Diagramm)

attachment.php


Hierbei sollen 2 packages erstellt werden, wobei jeweils Interfaces und im package entry eine Abstrakte Klasse enthalten sein soll. OK das bekomme ich soweit alles hin... auch der import der Packages untereinander scheint zu funktionieren.

Ich habe mir überlegt jetzt Objekte für die Klasse ArrayPhoneBook zu instanziieren. Diese kennt aber die Klassen PersonEntry und CompanyEntry nicht oder? Außerdem implementiert sie Methoden wie addEntry oder removeEntry. Daher erscheint es mir unlogisch dort ein Objekt von zu instanziieren.
Sinn würde aus meiner Sicht nur das Erstellen von Objekten für CompanyEntry und PersonEntry machen.
Das ist zumindest das, was ich bisher gelernt habe...mithilfe von Getter und Setter Methoden.

Kann mir daher bitte jemand bei der Herangehensweise bei dieser Aufgabe behilflich sein?

Vielen Dank schonmal,
Marcel
 

Anhänge

  • UML.JPG
    UML.JPG
    68,9 KB · Aufrufe: 161
Ein Testprogramm dafür könnte bspw. so aussehen:

Java:
PhoneBook pb = new ArrayPhoneBook();

IEntry entry1 = new PersonEntry(...);
IEntry entry2 = new CompanyEntry(...);

pb.addEntry(entry1);
pb.addEntry(entry2);

pb.show();

Ich verstehe deine Frage zum Instanziieren nicht ganz. Dein PhoneBook erstellt selbst keine Instanzen.
 
Ein Testprogramm dafür könnte bspw. so aussehen:

Java:
PhoneBook pb = new ArrayPhoneBook();

IEntry entry1 = new PersonEntry(...);
IEntry entry2 = new CompanyEntry(...);

pb.addEntry(entry1);
pb.addEntry(entry2);

pb.show();

Ich verstehe deine Frage zum Instanziieren nicht ganz. Dein PhoneBook erstellt selbst keine Instanzen.

Vielen lieben Dank für die schnelle Antwort.
Dass das Phonebook selbst keine Instanzen erstellt war auch meine Vermutung, ich war nur verwirrt, weil ich es bisher nur in der einfachen Variante kannte. D.h. eine Klasse mit Getter und Setter und eine Testklasse dazu. Von daher wirkt das Ganze hier sehr komplex für mich.

Aber danke schonmal für die Starthilfe... so langsam beginnt das Ganze Sinn zu machen, wenn ich mir dein Beispiel anschaue.

Eine Frage aber hätte ich noch. In welches Package packe ich diese Testklasse? Wahrscheinlich in das Package phonebook oder?
 
Eine Frage zum erstellen und löschen der Objekte der ArrayList.

Ich lege folgendes Objekt an

Java:
IEntry eintrag = new PersonEntry();
eintrag.setName(ReadInput("Name: "));
eintrag.setPhoneNumber(ReadInput("Nummer: "));
...
pb.anlegen(eintrag);

und übergebe es an die ArrayPhoneBook Klasse ums in die ArrayList zu speichern
Java:
@Override
public void anlegen(IEntry entry) {
	ArrayPhoneBook.pb.add(entry);		
}

wenn ich dieses Objekt nun anhand eines eingegebenen Namens suchen und löschen will, macht es ja keinen Sinn dafür ein neues Objekt zu erstellen, einen Namen zu setzen und das dann mit einem bestehenden Objekt zu vergleichen.

Daher bin ich mir unklar darüber, wie genau ich diese Funktion rufe

Java:
@Override
public void loeschen(IEntry pb) {
	// TODO Auto-generated method stub
}

Kann mir da bitte jemand helfen?
 
Du hast in deiner Testklasse doch ne Instanz von dem Eintrag den du entfernen willst:
Java:
IEntry eintrag = new PersonEntry();
eintrag.setName(ReadInput("Name: "));
eintrag.setPhoneNumber(ReadInput("Nummer: "));
...
pb.anlegen(eintrag);
...
pb.loeschen(eintrag);
 
Du läufst einfach solange durch dein Adressbuch durch, bis du den Namen gefunden hast? Alternativ tut´s auch ´ne HashMap mit dem Namen als Schlüssel, wenn das die Aufgabenstellung zulässt...
 
Zuletzt bearbeitet:
Du hast in deiner Testklasse doch ne Instanz von dem Eintrag den du entfernen willst:
Java:
IEntry eintrag = new PersonEntry();
eintrag.setName(ReadInput("Name: "));
eintrag.setPhoneNumber(ReadInput("Nummer: "));
...
pb.anlegen(eintrag);
...
pb.loeschen(eintrag);

Ja es ist EINE Instanz richtig. Aber ich erstelle ja mehrere in dieser Testklasse:

Java:
boolean run = true;
while (run) {
//generieren des Auswahlmenues
...
System.out.println("2 - Neuen Eintrag anlegen");
...		
String auswahl = ReadInput("***Bitte geben Sie eine Wahl ein (1-9): ");
int sel = Integer.valueOf(auswahl).intValue();
	switch (sel) {
...
        	case 2 : {
        		IEntry eintrag = new PersonEntry();
	        		eintrag.setName(ReadInput("Name: "));
...
       		        pb.anlegen(eintrag);
		        break;  
			}

Muss ich dann in der Testklasse erst anhand einer Eingabe (z.B. des Namens) das richtige Objekt suchen ums dann zu löschen?
 
Leider bekomme ich das Auslesen der Objekte nicht hin 🙁
Ich habe vor alle erstellten Objekte in eine Datei zu speichern mittels Serializable.

Ich habe jetzt nochmal das Kapitel Klassen und Objekte gelesen aber steige noch immer nicht dahinter 🙁

Ich versuche es mal der Reihe nach:

Ich lege eine neue Variable vom Typ IEntry an und packe dort das Objekt PersonEntry hinein und fülle es mit Werten usw.

Java:
IEntry eintrag = new PersonEntry();

Dann erstelle ich eine variable pb vom Typ ArrayPhoneBook
Hier füge ich dann die erstellen eintrag - Objekte hinzu.

Java:
private static ArrayPhoneBook pb = new ArrayPhoneBook();
...
pb.anlegen(eintrag);

In der Klasse ArrayPhoneBook wird ebenfalls eine Variable pb vom Typ ArrayList erstellt, welche die übergebenen Objekte der ArrayList hinzufügt.

Java:
private static ArrayList<IEntry> pb = new ArrayList<IEntry>();
....
per

public void anlegen(IEntry entry) {
		pb.add(entry);		
	}

Soweit komme ich mit, denke ich. War hoffentlich bis hierhin richtig erklärt.
Nun jedoch meine Verständnisfragen:

Worüber iteriere ich nun, um meine erstellten Objekte auszulesen um diese dann abuspeichern?
Über die ArrayList<IEntry> ? Und wenn ja, wie genau funktioniert dies aus der Klasse ArrayPhoneBookTest?

Ich habe das hier versucht aber das wird nix.

Java:
for (IEntry eintraege : ArrayList<IEntry>) {
	                	
	                }

Diese Aufgabe raubt mir noch meine letzte Nerven 🙁
 
Java:
for (IEntry eintraege : ArrayList<IEntry>) {
                        
                    }
Fast richtig, Du musst natürlich über eine List iterieren, die es schon gibt. Bei Dir wäre das pb aus ArrayPhoneBook.

Ach und nochwas, wenn alle Deine Klassen Serializable implementieren und selbst nur Serializable Felder enthalten (alles, was primitiv ist, ist Serializable, ArrayList ist auch Serializable), dann kannst Du direkt einen ObjectOutputStream benutzen und in ein File umleiten. Dann brauchst Du garnichts selbst auszulesen. Obwohl Dein Ansatz zum Serialisiern der Liste sehr lobenswert ist, weil wenn Du mal mit den Interfaces (hier List) arbeitest, Du das dann machen müsstest.
 
Zuletzt bearbeitet von einem Moderator:
Java:
for (IEntry eintraege : ArrayList<IEntry>) {
                        
                    }
Fast richtig, Du musst natürlich über eine List iterieren, die es schon gibt. Bei Dir wäre das pb aus ArrayPhoneBook.

Ach und nochwas, wenn alle Deine Klassen Serializable implementieren und selbst nur Serializable Felder enthalten (alles, was primitiv ist, ist Serializable, ArrayList ist auch Serializable), dann kannst Du direkt einen ObjectOutputStream benutzen und in ein File umleiten. Dann brauchst Du garnichts selbst auszulesen. Obwohl Dein Ansatz zum Serialisiern der Liste sehr lobenswert ist, weil wenn Du mal mit den Interfaces (hier List) arbeitest, Du das dann machen müsstest.

Ich hab das jetzt so implementiert mittels Serializable.

Speichern
Java:
	@Override
	public void speichern() {		
		try{
			FileOutputStream fos = new FileOutputStream("E:\\test");
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(pb);
			oos.flush();
			fos.close();
			}
			catch(Exception e){
				System.out.println("PhoneBook konnte nicht gesichert werden: " + e.toString());
			}	
	}

Laden
Java:
	@Override
	public void laden() {
		try{
			FileInputStream fis = new FileInputStream("E:\\test");
			ObjectInputStream ois = new ObjectInputStream(fis);
	
			pb = (ArrayList<IEntry>) ois.readObject();
			fis.close();
		}
		catch(Exception e){
			System.out.println("PhoneBook konnte nicht geladen werden: " + e.toString());
		}
	}

nur leider ist meine ArrayList leer nach dem Laden 🙁 Mach ich was falsch?
 
Die Idee war eigentlich, dass Du Dein komplettes ArrayPhoneBook speicherst und nicht nur Teile daraus.

Aber der von Dir gezeigte Code hätte eigentlich auch funktionieren müssen, vorausgesetzt pb war nicht schon beim Speichern leer. Wie sieht denn die Datei "E:\\test" aus, wenn Du sie mit einem Texteditor öffnest? Ist zwar ein bischen kryptisch, aber man kann schon einigermaßen erkennen, was da drinnen ist.
 

Zurück
Oben