Telefonliste mit interface implementieren

Bitte aktiviere JavaScript!
Hallo liebe Java freunde,

ich bin dabei das programmiemren einer Telefonliste mit interfaces zu erlernen.
Nur komme ich nicht weiter. Und zwar macht mir meine klasse welches mein inreface implementiert problem.
Ihc habe folgenden konstruktor:

Java:
public class TelephoneEntry {

private String name;
private String nummer;

public TelephoneEntry(String name, String nummer) {
    this.name = name;
    this.nummer = nummer;
}}
Mein interface sieht so aus:

Java:
public interface TelephoneListSpec {
    
    public void add();
    public void remove();
    public void seek();
    public void identify();

}
Meine Klasse welches das interface implementiert:

Java:
public class TelephoneList implements TelephoneListSpec {

    @Override
    public void remove() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void seek() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void identify() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void add() {
        // TODO Auto-generated method stub
        
    }
}
und zuguter letzt meine Klasse mit der main metohde:

Java:
public class TelephoneTester {

    public static void main(String args[] ) {

        TelephoneList tl = new TelephoneList();

        TelephoneEntry te1 = new TelephoneEntry("Müller", "1212121212");

        TelephoneEntry te2 = new TelephoneEntry("Meier", "34343434");

        TelephoneEntry te3 = new TelephoneEntry("Heitmüller", "56565656");

        tl.add(te1);

        tl.add(te2);

        tl.add(te3);
}}

Bekomme unter Eclipse bei der Zeile tl.add(te1); eine Fehlermeldung, das die Methode add() in der Klasse TelephoneList nicht anwendbar ist.

Es wird dann folgender Code in TelephoneList eingefüht/vorgeschlagen:

Java:
public void add(TelephoneEntry te1) {
        // TODO Auto-generated method stub
        
    }
Diese add() methode soll ja aber nicht nur für den Eintrag te1 gelten sonder für alle te1-te3.
Irgendwas vertehe ich da was falsch glaube ich.
Für Hilfe wäre ich sehr dakbar.
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Du definierst die Funktion add ohne Parameter, also kannst Du die auch nur ohne Parameter aufrufen. Wenn du da ein TelephoneEntry übergeben willst, dann solltest Du dies in dem Interface und der Implementierung auch entsprechend so schreiben.

Und in dem Vorschlag wird ja in TelephoneList so eine Funktion hinzugefügt. Der Name des Parameters ist dabei doch egal. Er schlägt Dir te1 vor, weil Eclipse davon ausgeht, dass das ein sinnvoller Name ist, da Du dies ja im Aufruf zu verwendet hast. (Vermute, dass Eclipse so eine Logic anwendet, aber ich selbst nutze Eclipse nicht.)
Aber du kannst die Funktion add natürlich mit beliebigen TelephoneEntry instancen aufrufen, egal wie diese denn nun im Parameter heissen.
 
Erstmal vielen dank für deine Antwort.

Ich glaube ich habe es verstanden. :)
Nur wie kann ich meinen Array in der Konsole ausgeben?
System.out.println(tl.toString);
gibt mir wieder einen (Objekt?) aus.
[email protected]
 
Ich verstehe nur nicht warum ich diesen parameter frei wählen kann/darf???
Ich wäre jetzt davon ausgegangen, dass dieser auch (TelephoneEntry te1) heissen muss.

Und mal zum Verständnis:

Ich habe doch Objekte mit Namen und Telefonnummern, die ich jeweils in te1, te2 und te3 speichere.
Diese werden dann in meine TelephoneList tl hinzugefügt.
Also um es zu verdeutlichen:

1. TelephoneList tl <------- te1
2. TelephoneList tl <------- te2
3. TelephoneList tl <------- te3

somit habe ich 3 Objecte in meiner Liste.

Wie kann ich diese denn mit der for:each schleife durchlaufen, damit ich damit arbeiten kann?

ich versuche es mit
Java:
for (String liste : tl) {

}
Oder kann ich die einträge in tl nicht mit der for:each schleife ansprechen????
 
1. Nein, da es keine Liste ist, so wie du es implementiert hast und
2. Wie kommst du darauf, dass das Strings sein sollten?
 
Ja, es sind Objekte. Aber eigentlich fast alles sind Objekte. Listen sind auch Objekte. Daher ist man gerne etwas genauer.

Und dann hast Du z.B. eine Instanz von der Klasse TelephoneList. Oder Instanzen von der Klasse TelephoneEntry.

Und wenn Du eine for each schleife hast, dann muss da entweder ein array oder eine Instanz von Iterable verwendet werden.
Damit Deine TelephoneList in der for each Schleife verwendet werden kann, muss Deine Klasse also Iterable implementieren.
 
Ich verstehe nur nicht warum ich diesen parameter frei wählen kann/darf???
Ich wäre jetzt davon ausgegangen, dass dieser auch (TelephoneEntry te1) heissen muss.
Bei einem Parameter handelt es sich im Prinzip nur um eine lokale Variable. Sie ist nur innerhalb der Methode gültig. Du kannst sie benennen wir du willst, bzw. natürlich im Rahmen der Java-Spezifikation.

Java:
public foo(Object someObject) { // deklariert eine Parameter-Variable vom Typ Object
    // code
} // ab hier ist die Variable nicht mehr gültig

public bar() {
    Object aObject = new Object(); // deklariert eine lokale Variable vom Typ Object
   
    foo(aObject); // die an foo() übergeben wird. Wichtig ist nur, dass sie vom selben Typ ist.
   
    // unterstellen wir, dass die Methode getSpecialObject() als Rückgabewert ein Object liefert
    foo(objectList.getSpecialObject()); // dann kann dies auch an foo() übergeben werden.
}
 
Ich kapiere das mit dem iterables irgendwie nicht. Kann mir das bitte jemand vielleicht mal an einem Beispiel zeigen wie sowas auszusehen hat???

Hier mal mein bisheriger code:

Java:
import java.io.*;
import java.util.*;
    
public class TelephoneTester {

    public static void main(String args[] ) throws IOException {

        TelephoneList tl = new TelephoneList();

        TelephoneEntry kontakt = new TelephoneEntry("", "");

        System.out.println("Bitte geben Sie ein, was sie tun möchten:");
        System.out.println("1. Eintrag anlegen");
        System.out.println("2. Eintrag löschen");
        System.out.println("3. Nach einer Person scuhen");
        System.out.println("4. Eine Telefonnumer identifizieren");
        System.out.println("Zum beenden (exit) eingeben");

        
      
        while (true) {
            //Einlesen ueber die Konsole
                 String kommando = textEingeben("");
                 String[] teilen = kommando.split(" ");
                 String name = "";
                 String nummer = "";
                
      
          Iterator it;
                /**
           *switch Anweisung zum zuordnen des eingelesenen kommandos.
           *Ausgabe des kommando Befehls und nachfolgender argumente.
           *Break-point zum unterbrechen nach erfolgreicher suche.
           */
                 switch (teilen[0])  {

                 case "1":
                     kontakt.add(); 
                     break;
                 case "2":
                     System.out.println(kontakt);
               //Hier gibt er mir den die speicheradresse [email protected] aus
Iterator????   
          
                    
                     break;
                 case "3":
                     System.out.println("3 ausgewählt");
                     break;
                 case "4":
                     System.out.println("4 ausgewählt");
                     break;
                 case "exit":
              //Verlassen des Programmes mit "exit"
                     System.out.println("Vielen dank und auf wiedersehen!");
                     System.exit(0); break;
              //Ausgabe fuer erfolglose suche
                 default:
                     System.out.println("Befehl nicht gefunden!");
                 }
             }
         }
           /**
            * Einlesen der Zeile ueber die konsole.
            * @param eingabe
            *        Strin uebergabe
            * @return eingelesene Zeile
            * @throws IOException
            *       Fehler abfangen
            */
         public static String textEingeben(String eingabe) throws IOException {
             //Erzeugen des Eingabestroms
             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
             //Warten auf Eingabe
             System.out.print("> " + eingabe);
             return br.readLine();
         }
}
 
Ich habe in meiner Klasse TelephoneEntry die methode add():

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class TelephoneEntry {
    
private String name;
private String nummer;

public TelephoneEntry(String name, String nummer) {
    this.name = name;
    this.nummer = nummer;
}

public String add() throws IOException {
    // TODO Auto-generated method stub
       //Erzeugen des Eingabestroms
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    // Warten auf Eingabe
    System.out.print("Bitte geben Sie den Namen der Person ein: ");
    return br.readLine();
}
}
Wenn ich jetzt das Programm ausführe und in meiner switch Anweisung "1" auswähle, bin ich davon ausgegeangen, dass die Methode add() in meiner Klasse TelephoneEntry aufgerufen wird.
So dass in der Konsole :
Bitte geben Sie den Namen der Person ein:
erscheint und ich einen namen eingeben kann.
Ist jetzt die Frage ob er dann mit kontakt.add() das eingelesene Speichert.
Das wollte ich überprüfen, in dem ich mein TelephoneEntry kontakt in der konsole ausgebe.
 
Ich würde das etwas anders machen.

Dein ursprünglicher TelephoneEntry ist grundsätzlich OK (es fehlen ggf. noch getter-Methoden). Eine Methode add(), die Daten von der Konsole einliest hat hier nichts verloren. Das ist nicht die Aufgabe dieser Klasse und muss separat behandelt werden.

Java:
public class TelephoneEntry {
    private String name;
    private String nummer;

    public TelephoneEntry(String name, String nummer) {
        this.name = name;
        this.nummer = nummer;
    }
}
Die einfachste Möglichkeit Daten vom Typ TelephoneEntry in einer Liste zu halten wäre so etwas:

Java:
List<TelephoneEntry> telephoneList  = new ArrayList<>();

telephoneList.add(new TelephoneEntry("Hans Dampf", "0815");
Das List-Interface von Java stellt alle gängig benötigten Listenmethoden bereit, so dass damit auch funktioniert:

Java:
for (TelephoneEntry entry : telephoneList) { // das ist eine enhanced for-Loop, die über alle Einträge iteriert.
    System.out.println(entry.getName());
}
Edit: Schau dir unbedingt mal an, welche Methoden "List<>" zur Verfügung stellt und was für Funktion diese haben:

https://docs.oracle.com/javase/7/docs/api/java/util/List.html
 
Zuletzt bearbeitet:
Ertmal vielen dnak für deine Hilfestellung.
Wenn ich das so implementiere, gibt eclipse unter case1 einen Fehler.

Java:
    case "1":
                     kontakt.add();
                     break;
Es wird kontakt.add(null) vorgeschlagen, aber das ist doch falsch. Er fügt ja dann nur "null" zu und greift doch nicht auf die add() methode, oder liegt der Fehler woanders?

Die API gibt ja folgendes an:
add(E e)

Was ist hier e und was ist E
 
Zuletzt bearbeitet:
Welchen Typ hat denn die Instanz "kontakt"?

Was ist hier e und was ist E
List<E> ist eine sogenannte generische Klasse, die nicht auf einen bestimmten Typen festgelegt ist. D.h. du legst bei der Definition der Variablen fest, welcher Typ in der Instanz gespeichert wird:

Java:
List<String> stringList = new ArrayList<>(); // eine Liste für Strings
List<Integer> integerList = new ArrayList<>(); // eine Liste für Integers
List<Object> objectList = new ArrayList<>(); // eine Liste für Objects
In der Doku steht E als Platzhalter für einen konkreten Typen und e ist der Name der Parametervariablen.

Deine Liste List<TelephoneEntry> telephoneList ist also dafür gedacht Instanzen von "TelephoneEntry" aufzunehmen. Dementsprechend erwartet "add()" natürlich eine konkrete Instanz als Parameter, siehe #17

Java:
Scanner scanner = new Scanner(System.in);

System.out.println("Geben Sie den Namen ein:");

String name = scanner.nextLine();

System.out.println("Geben Sie die Telefonnummer ein:");

String telephone = scanner.nextLine();

telephoneList.add(new TelephoneEntry(name, telephone));
 
Welchen Typ hat denn die Instanz "kontakt"?

[/CODE]
Es sind String´s. Bekomme auch die fehlermeldung bei Eclipse das es nicht für Strings anwendbar ist.

Es müsste doch dann wie folgt aussehen:

Java:
  case "1":
 kontakt.add(name, nummer); 
 break;
oder sehe ich das falsch?
 
Zuletzt bearbeitet:
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben