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 komme mit dem Thema Interface nicht ganz zurecht. Irgendwie fehlt mir hier das Verständnis. Es gibt viele Seite mit Beispielen, die aber irgendwie bei mir nicht die Lampe einschalten.
Kann ich in einem Interface z.B. ein Objekt der Klasse Datenbank erzeugen und hier die Methoden des Datenbankzugriffs anbieten?
Wäre das eine Praxisanwendung?
einerseits eine Art "Mehrfachvererbung" wobei Interfaces immer abstrakt sind
andererseits ein angenehmes Mittel verschiedene Klassen dasselbe Interface aufzuzwingen (oder besser den Programmierern der Klassen)
class baum extends pflanze {}
// Klasse Baum erweitert Pflanze, also Baum "ist eine" Pflanze
und bei Interfaces wird "Mehrfachvererbung" angewendet.
Java:
interface Hauspflanze {}
//anstatt "class" wird "interface" benutzt, und interface ist abstrakt also es wird nicht implementiert.
//wobei der implemetierungscode in die konkreten classe kommt.
class Bonsai extends Pflanze implements Hauspflanze {}
// implements ist das Schlüsselwort.
// ein Bonsai "ist eine" Pflanze, aber auch "ist eine" Hausplfanze.
ich weigere mich immer Interfaces als Mehrfachvererbung abzutun, aber die Diskussion hat wir schonmal.
Interfaces beschreiben, was eine Klasse kann, ohne das Verhalten spezifisch zu bestimmen.
An deinem Bsp mit der Datenbank. Es gibt ein Interfaces das die ueblichn CRUD Methoden anbietet. Nun kannst du Software schrieben die nur mit diesen Interface arbeitet und es kann versch. Implementierungen geben, die dann zb MySQL oder Oracle oder was auch immer benutzen.
Somit sind Interfaces eine Beschreibung von Funktionalitaet einer Klasse. Nach dem Prinzip "Ich kann folgendes machen, wie genau ich das mach, das weisst du nicht und brauchst du auch nicht wissen". Sozusagen ein bindender Vertrag den die Klasse erfuellt
Aber kann ich ein Objekt erzeugen und hier die Referenz quasi vererben?
Wenn ich das gelesen und verstanden habe enthalten Interfaces nur abstracte Methoden.
schau dir mal [c]Comparable[/c], was ein gutes Bsp ist. Jede Klasse die Comparable implementiert kann sagen, wie sie sortiert werden soll.
Sortiertalgorithmen ist dann egal was fuer eine konkrete Klasse sortiert wird, es reicht, dass sie Comparable implementieren
Mit "interface" geht das nicht. Selbst wenn es gehen würde, wäre es nicht sinnvoll. Mit einer abstrakten Klasse würde es zwar gehen, ist aber gleichfalls nicht sinnvoll. Warum nicht? Weil ein Auto kein SQL- Zugriff ist! Ein solcher Entwurf widerspricht jeder Logik.
Das macht eine rein abstrakte Vaterklasse auch ...
Gerade für Leute die erst einmal eine Sprache gelernt haben die keine Interfaces kennt, ist es immer noch die beste Erklärung.
Teialehrbuch hat gesagt.:
In Java gibt es nur Einfachvererbung, d.h. man kann nach dem Schlüsselwort extends nicht eine Liste von Superklassen angeben, wie es in einigen anderen Programmiersprachen möglich ist. Die Arbeit mit Interfaces erlaubt jedoch eine Simulation der Mehrfachvererbung.
Ein Interface kann man (ganz abstrakt) als einen 'Vertrag über eine gemeinsame Schnittstelle' verstehen.
Wie in einem Vertrag legst du bei einem Interface immer nur fest, was ein Vertragspartner anbieten muss um den Vertrag zu erfüllen. Die Art und Weise er die Vertragsbedinungen erfüllt, ist dann ihm überlassen.
Deswegen deklarierst du in einem Interface ja auch nur die Methode, die eine Methode umsetzen muss, um diesem Interface (seinem Vertrag) gerecht zu werden.
Als Beispiel:
Java:
public Interface IPersonalDaten{
public int getPersonalNummer(String Vorname,String Nachname);
public int getGehalt(String Vorname,String Nachname);
}
Du sagst also:
Alle Klassen die mir den Zugriff auf Personaldaten erlauben sollen, müssen mindestens diese beiden Methoden anbieten. Wie Sie die Rückgabewerte ermitteln sind dann Umsetzungspezifika der Klassen.
Weiteres Beispiel:
Java:
/** Personaldatenermittlung über Datenbanzugriff
*/
public class PersonalDatenDatabase implements IPersonalDaten{
private java.sql.Connection;
public int getPersonalNummer(String Vorname,String Nachname){
connection..... //Herstellen der Datenbankverbindung und Abfrage
...
}
public int getGehalt(String Vorname,String Nachname){
connection..... //Herstellen der Datenbankverbindung und Abfrage
}
}
Java:
/** Personaldatenermittlung über Dateizugriff
*/
public class PersonalDatenFileBased implements IPersonalDaten{
private java.io.File datei;
public int getPersonalNummer(String Vorname,String Nachname){
datei... // Abfrage aus Datei
...
}
public int getGehalt(String Vorname,String Nachname){
datei.... // Abfrage aus Datei
}
}
Beide Klassen bieten dir also die vom Vertrag geforderten Methoden an (implementieren die Schnittstelle). Die Art und Weise, wie sie die Methoden umsetzen ist aber grundverschieden (eine Klasse stellt einen DAtenbankzugriff her, die anderen liest aus einer Datei).
Der Vorteil hier ist, dass du jetzt den Personaldatenzugriff abstrahieren kannst:
Java:
...
IPersonalDaten personalWirtschaft = new PersonalDatenDatabase();
//oder
IPersonalDaten personalWirtschaft = new PersonalDatenFileBased();
personalWirtschaft.getGehalt("Max","Mustermann");
da dir beim Aufruf von .getGehalt egal ist, ob du auf einem PersonalDatenDatabase-Objekt oder einem PersonalDatenFileBased arbeitest.
Tante Edith sagt: Das hat doch der Bygones schonmal geschrieben. Naja, ist Freitag :toll: