Interface: Unterschied zwischen den Versionen
Sn (Diskussion | Beiträge) K (Navileiste) |
Sn (Diskussion | Beiträge) |
||
Zeile 3: | Zeile 3: | ||
Im Gegensatz zur [[Abstrakte Klasse|abstrakten Klasse]] können Interfaces nur Methodenköpfe und keine ausprogrammierten Methoden enthalten. Dafür dürfen Klassen auch beliebig viele Interfaces implementieren, während [[Vererbung (Informatik)#Mehrfachvererbung|Mehrfachvererbung]], also das Erben von mehreren Oberklassen, in vielen Programmiersprachen verboten ist. Die Implementierung von mehreren Interfaces ist deshalb möglich, weil die vorgegebenen Methoden ja sowieso von der Klasse definiert werden müssen und keine Konflikte auftreten können. | Im Gegensatz zur [[Abstrakte Klasse|abstrakten Klasse]] können Interfaces nur Methodenköpfe und keine ausprogrammierten Methoden enthalten. Dafür dürfen Klassen auch beliebig viele Interfaces implementieren, während [[Vererbung (Informatik)#Mehrfachvererbung|Mehrfachvererbung]], also das Erben von mehreren Oberklassen, in vielen Programmiersprachen verboten ist. Die Implementierung von mehreren Interfaces ist deshalb möglich, weil die vorgegebenen Methoden ja sowieso von der Klasse definiert werden müssen und keine Konflikte auftreten können. | ||
==Beispiel: | ==Beispiel: {{Java|Comparable}}== | ||
Ein typisches Interface ist | Ein typisches Interface ist {{Java|Comparable}}. [[Objekt (Informatik)|Objekt]]e von Klassen, die {{Java|Comparable}} sind, können in irgendeiner Hinsicht miteinander verglichen und damit z.B. auch sortiert werden. In der Java-API ist zum Beispiel für die Methode {{Java|Arrays.sort}}, mit der [[Array|Arrays]] sortiert werden können, festgelegt:<blockquote cite="Java-API"> | ||
{{Java|public static void sort(Object[] a)}} | |||
Sorts the specified array of objects into ascending order, according to the natural ordering of its elements. '''All elements in the array must implement the | Sorts the specified array of objects into ascending order, according to the natural ordering of its elements. '''All elements in the array must implement the {{Java|Comparable}} interface''' [eigene Hervorhebung]'''.''' Furthermore, all elements in the array must be ''mutually comparable'' (that is, {{Java|e1.compareTo(e2)}} must not throw a {{Java|ClassCastException}} for any elements {{Java|e1}} and {{Java|e2}} in the array).<ref>[https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/Arrays.html#sort(java.lang.Object%5B%5D) Klasse Arrays in der Java 18 API]</ref></blockquote>Jede Klasse, die dieses Interface implementiert, muss eine Methode namens {{Java|compareTo}} enthalten, die es ermöglicht, die Objekte dieser Klasse mit anderen Objekten zu vergleichen:<syntaxhighlight lang="java" line="1"> | ||
public class Person implements Comparable<Person> { | public class Person implements Comparable<Person> { | ||
Zeile 26: | Zeile 26: | ||
} | } | ||
} | } | ||
</syntaxhighlight>Ein Array von | </syntaxhighlight>Ein Array von {{Java|Person}}en könnte nun mit {{Java|Arrays.sort}} sortiert werden. | ||
Das Interface kann nun auch wie ein Datentyp angegeben werden, etwa um Methoden wie diese zu definieren:<syntaxhighlight lang="java" line="1"> | Das Interface kann nun auch wie ein Datentyp angegeben werden, etwa um Methoden wie diese zu definieren:<syntaxhighlight lang="java" line="1"> | ||
Zeile 35: | Zeile 35: | ||
return b; | return b; | ||
} | } | ||
</syntaxhighlight>Dieser Methode ist es völlig gleich, was für Objekte ihr übergeben werden, solange diese das | </syntaxhighlight>Dieser Methode ist es völlig gleich, was für Objekte ihr übergeben werden, solange diese das {{Java|Comparable}}-Interface implementieren. Auch über den Rückgabetypen kann nur ausgesagt werden, dass es ein {{Java|Comparable}} ist. | ||
Aufrufe wie | Aufrufe wie {{Java|new Comparable()}} sind hingegen nicht zulässig, da Interfaces nicht instanziiert werden können. | ||
== Quellen == | == Quellen == |
Aktuelle Version vom 26. Januar 2025, 03:30 Uhr
Ein Interface (engl. Schnittstelle) ist in der objektorientierten Programmierung eine Möglichkeit, für bestimmte Klassen festzulegen, welche Methoden sie aufweisen sollen, ohne diese zu definieren. Wie sie diese Methoden ausdefinieren, obliegt jeder Klasse, die dieses Interface implementiert, selbst.
Im Gegensatz zur abstrakten Klasse können Interfaces nur Methodenköpfe und keine ausprogrammierten Methoden enthalten. Dafür dürfen Klassen auch beliebig viele Interfaces implementieren, während Mehrfachvererbung, also das Erben von mehreren Oberklassen, in vielen Programmiersprachen verboten ist. Die Implementierung von mehreren Interfaces ist deshalb möglich, weil die vorgegebenen Methoden ja sowieso von der Klasse definiert werden müssen und keine Konflikte auftreten können.
Beispiel: Comparable
Ein typisches Interface ist Comparable
. Objekte von Klassen, die Comparable
sind, können in irgendeiner Hinsicht miteinander verglichen und damit z.B. auch sortiert werden. In der Java-API ist zum Beispiel für die Methode Arrays.sort
, mit der Arrays sortiert werden können, festgelegt:
public static void sort(Object[] a)
Sorts the specified array of objects into ascending order, according to the natural ordering of its elements. All elements in the array must implement the
Comparable
interface [eigene Hervorhebung]. Furthermore, all elements in the array must be mutually comparable (that is,e1.compareTo(e2)
must not throw aClassCastException
for any elementse1
ande2
in the array).[1]
Jede Klasse, die dieses Interface implementiert, muss eine Methode namens compareTo
enthalten, die es ermöglicht, die Objekte dieser Klasse mit anderen Objekten zu vergleichen:
public class Person implements Comparable<Person> {
private String firstName;
private String lastName;
public Person(String first, String last) {
this.firstName = first;
this.lastName = last;
}
public int compareTo(Person other) {
if (this.lastName.equals(other.lastName)) {
return this.firstName.compareTo(other.firstName);
}
return this.lastName.compareTo(other.lastName);
}
}
Ein Array von Person
en könnte nun mit Arrays.sort
sortiert werden.
Das Interface kann nun auch wie ein Datentyp angegeben werden, etwa um Methoden wie diese zu definieren:
public Comparable max(Comparable a, Comparable b) {
if (a.compareTo(b) > 0) {
return a;
}
return b;
}
Dieser Methode ist es völlig gleich, was für Objekte ihr übergeben werden, solange diese das Comparable
-Interface implementieren. Auch über den Rückgabetypen kann nur ausgesagt werden, dass es ein Comparable
ist.
Aufrufe wie new Comparable()
sind hingegen nicht zulässig, da Interfaces nicht instanziiert werden können.