interface DBAccess
{
Data getData();
}
class OracleDataAccess implements DBAccess
{
@override
Data getData()
{
// irgendwelcher Code
}
}
DBAccess db = new OracleDataAccess();
Data data = db.getData();
DBAccess db = new MyDataAccess();
// Der weitere Code, der die Schnittstelle verwendet muss nicht angepasst werden
Data data = db.getData();
Bezogen auf diese Frage: Es könnte neben dem Sparkonto auch noch ein TagesgeldKonto oder InvestmentKonto geben. Sofern alle die genannte Schnittstelle implementieren kannst du z.B. alle Kontoarten gemeinsam in einer Liste verwaltenDas habe ich mir schon angesehen, ich kann auch gerne am Beispiel des WikipediaArtikels erklären, was ich nicht verstehe. Wieso wird dort ein Interface erstellt, damit ich den Kontostand mit getKontostand() aufrufen kann? Wieso reicht es nicht, wenn ich, falls benötigt, den Kontostand einfach mit getKontostand() aufrufe?
List<Konto>
und über die Schnittstellenmethode "getKontostand()" den Kontostand abfragen. "List" selbst ist übrigens auch ein Interface:List<Konto> konten = ArrayList<Konto>;
// oder
List<Konto> konten = LinkedList<Konto>;
void doSomething(Konto konto)
{
// .. irgendwelcher code
kontostand = konto.getKontostand();
// ... mehr code
}
"Programmiere auf eine Schnittstelle hin, nicht auf eine Implementierung." [Deutsch:GOF1996]
public interface Elevateable
{
public double getMaxWeight();
public boolean isPosibleToLift(double weight);
}
public class Crane implements Elevateable
{
final static double MAX_WEIGHT = 10000;
@Override
public double getMaxWeight()
{
return Crane.MAX_WEIGHT;
}
@Override
public boolean isPosibleToLift(double weight)
{
return this.getMaxWeight() > weight;
}
}
public class LiftingCart implements Elevateable
{
final static double MAX_WEIGHT = 1000;
@Override
public double getMaxWeight()
{
return LiftingCart.MAX_WEIGHT;
}
@Override
public boolean isPosibleToLift(double weight)
{
return this.getMaxWeight() > weight;
}
}
public class Mensch implements Elevateable
{
private final int maxWeight;
public Mensch(int maxWeight)
{
this.maxWeight = maxWeight;
}
@Override
public double getMaxWeight()
{
return this.maxWeight;
}
@Override
public boolean isPosibleToLift(double weight)
{
return this.getMaxWeight() > weight;
}
}
public class Bionic implements Elevateable
{
private final double maxWeight;
private final int bodyParts;
public Bionic(double maxWeight, int bodyParts)
{
this.maxWeight = achievement(maxWeight, bodyParts);
this.bodyParts = bodyParts;
}
@Override
public double getMaxWeight()
{
return this.maxWeight;
}
@Override
public boolean isPosibleToLift(double weight)
{
return this.getMaxWeight() > weight;
}
private double achievement(double weight, int parts)
{
return weight * parts;
}
}
Kannst du das an deinem obigen Codebeispiel erklären ? Was bedeutet dort "Erweiterung des Codes nur an einer Stelle" bzw. inwiefern wird Doppelcode verhindert durch Verwendung eines Interfaces ?Wartbarkeit und Erweiterung des Codes an nur einer Stelle für alle und natürlich die Einzigartigkeit des Codes (kein Doppelcode)
Das sind übrigens leider genau die Dinge, die sich rein durch das Interface nicht formal ausdrücken lassenDie Spezifikation sind die Vor- und Nachbedingungen der Operationen der Klasse.
Ja, es gibt schon Vor/Nachbedingungen, aber man kann sie eben formal nicht alle definieren (abgesehen von den Parameter- und Rückgabe-Typen).Ja, das gilt für Klassen. Finde jedoch, dass eine Methode, welche Parameter besitzt und etwas liefert, ganz gleich, ob von Interface oder einer normalen Klasse, ebenso Vor- und Nachbedingungen stellt, stellt? finde gerade kein besseren Begriff für. boolean isPosibleToLift(double weight) hat Vor- und Nachbedingungen, oder nicht?
Was heißt "formal definieren"? Sorry, zu dieser späten Stunde komm ich nicht ganz mit.mrBrown hat gesagt.:Eine Vorbedingung könnte zB sein, dass das Gewicht größer als 0 sein muss - diese lässt sich aber formal so nicht definieren
In dem Kontext hauptsächlich, dass es maschinenlesbar und automatisiert verarbeitbar istWas heißt "formal definieren"? Sorry, zu dieser späten Stunde komm ich nicht ganz mit.
/**
* Check for possibility to lift {@code weight}
* {@code weight} has to be at least 0
*
* @param weight The weight to be lift
* @return true, if is posible
*/
public boolean isPosibleToLift(double weight);
Nein, das ganze im Javadoc zu beschreiben ist nicht formalHabe ich es formal definiert? Wenn nicht, bitte um anschauliches Beispiel
Java:/** * Check for possibility to lift {@code weight} * {@code weight} has to be at least 0 * * @param weight The weight to be lift * @return true, if is posible */ public boolean isPosibleToLift(double weight);
public boolean isPosibleToLift(@Min(0) double weight);
isPosibleToLift(n) impliziert isPosibleToLift(n-1)
oder (nicht isPosibleToLift(n)) impliziert (nicht isPosibleToLift(n+1))
(ich hab aber keine Ahnung, ob und wie man das mit zB OCL ausdrücken könnte Vor- und Nachbedingungen sind (mindestens implizit) Teil eines Interfaces.Was hat das übrigens alles mit Interface zu tun ? Ein Interface definiert wie der Name schon sagt eine Schnittstelle, nicht mehr und nicht weniger.
Nun ja, diese neue Methode muss genauso in allen Klassen hinzugefügt werden die dieses Interface implementieren wie es auch ohne Interface der Fall wäre. Und ein Interface "bietet" keine Methoden sondern es verlangt sie. Die Vorteile eines Interfaces entstehen dort wo man Objekte verwendet die dieses Interface implementieren. Ist hier ganz gut mit Beispiel erklärt: https://www.java-forum.org/thema/interfaces.117297/Nun kann diese nur an einer Stelle eingefügt werden (Interface) und jede implementierende Klasse wird es implementieren müssen. Ein Interface bietet ja letztendlich eine bestimmte Anzahl an Methoden
Das ist Haarspalterei und es ging hier um das Java-Sprachelement "Interface". Vor- und Nachbedingungen hast du bei jeder Methode, egal ob über Interface verlangt oder "stinknormale" Methode. Es bringt also für das Verständnis von Interface nichts sich über Vor- und Nachbedingungen zu unterhalten.Zumindest, wenn man über die rein technische Definition eines Interfaces in Java hinaus geht
Allerdings wurde durch die folgende Aussage:Das ist Haarspalterei und es ging hier um das Java-Sprachelement "Interface". Vor- und Nachbedingungen hast du bei jeder Methode, egal ob über Interface verlangt oder "stinknormale" Methode. Es bringt also für das Verständnis von Interface nichts sich über Vor- und Nachbedingungen zu unterhalten.
suggeriert, das Java-Interfaces eine Spezifikation dafür liefern, was sie aber nicht tun. Insofern finde ich schon, dass man das zumindest klarstellen sollte. Außerdem ist es auch ganz interessant, was man allgemein von Interfaces verlangen könnte und inwieweit Java-Interfaces das leisten. Ich stimme dir aber zu, dass das für den TE inzwischen wahrscheinlich zu weit führt.Die Spezifikation sind die Vor- und Nachbedingungen der Operationen der Klasse.
Mit deinen Worten: Haarspalterei, es ging um das Java-Sprachelement "Interface" und dieses deklariert Methoden, was eher einem "bieten" als einem "verlangen" entsprichtNun ja, diese neue Methode muss genauso in allen Klassen hinzugefügt werden die dieses Interface implementieren wie es auch ohne Interface der Fall wäre. Und ein Interface "bietet" keine Methoden sondern es verlangt sie.
Es wurde angesprochen, also bin ich drauf eingegangen, offensichtlich gab es ja auch Interesse daran ¯\_(ツ)_/¯Das ist Haarspalterei und es ging hier um das Java-Sprachelement "Interface". Vor- und Nachbedingungen hast du bei jeder Methode, egal ob über Interface verlangt oder "stinknormale" Methode. Es bringt also für das Verständnis von Interface nichts sich über Vor- und Nachbedingungen zu unterhalten.
Da Interface, laut Java, eine Klasse ist, gilt es dennoch. Und weil es für ein Interface, wie für jede andere Klasse gilt, haben auch die Operationen von Interfaces Vor- und Nachbedingungen. Ich finde, es gehörte an der Stelle erwähnt.JStein52 hat gesagt.:Es bringt also für das Verständnis von Interface nichts sich über Vor- und Nachbedingungen zu unterhalten
Das wird wohl stimmenMeniskusschaden hat gesagt.:Ich stimme dir aber zu, dass das für den TE inzwischen wahrscheinlich zu weit führt.
Echt ? Interface ist eine Klasse ? Steht das irgendwo ? Wie sieht der Konstruktor eines Interfaces aus ? Wie erzeuge ich Instanzen eines Interfaces ?Da Interface, laut Java, eine Klasse ist, gilt es dennoch.
Ein Interface ist vor allem ein Datentyp bei dem man weiss dass er bestimmte Methoden zur Verfügung stellt.Ein Interface ist mMn. eine Ansammlung von Operationen, welche sich auf die Gemeinsamkeiten verschiedener Objekte konzentrieren, das selbe wird auch in dem von dir verlinktem Thread erläutert.
Zur Erinnerung vielleicht noch mal die ursprüngliche Frage ....Worin unterscheidet sich dann ein Interface von einer normalen Methode? Wann brauch ich sie zwingend?
Nur um ein paar zu verlinken. Überall steht es, dass Interface als eine spezielle Klasse angesehen werden kann.JStein52 hat gesagt.:Interface ist eine Klasse? Steht das irgendwo?
Das stimme ich zu, für Anfänger ist aber zu kurz zu kapieren. Ich würde eine Geschichte von der früheren Praxis bei einem Automotiv-Projekt erzählen, vielleicht wird es noch deutlicher. Meine damalige Team machte Frontend, die Daten für Produktion sollen nicht nur auf der Bildschirm, sondern als Excel-Datei exportiert werden. Diese Arbeit übernahm eine Auszubi-Gruppe, was ich zuerst nicht davon wusste. Einmal kam der Auzubi-Frontmann zu mir und fragte, wie heißt die Name der Java-Klasse, die Module seiner Gruppe aufruft. Ich sagte ihm, ich wusste nicht wer es macht, aber wenn Ihr Anwendungen (API) für anderen bereit stellt, dann sind Eure Schnittstellen unabhängig von Anwendern, also sind die Parameter, die Anwender an Euren Klassen (gleich ob Parameter über Konstruktor oder Methoden!) übergeben, sollen als Interface definiert sein. Die Anwender müssen dafür sorgen, dass (Parameter-)Klasse Eure Bedingungen erfüllen (implementiert Eurer API), nicht umgekehrt.Was hat das übrigens alles mit Interface zu tun ? Ein Interface definiert wie der Name schon sagt eine Schnittstelle, nicht mehr und nicht weniger.
Was hilft diese Wischi-Waschi-Aussgae beim Verständnis von Interfaces ? Im Wikibeitrag ist von Kontoarten die Rede die eine Methode getKontostand() oder so ähnlich implementieren. Das kann man ohne Interface tun ohne eine einzige Codezeile mehr oder weniger oder doppelt zu schreiben. Die Frage des TE war wann sollte man besser ein Interface dafür definieren und was hat das dann für Vorteile ? Man kann ja noch weiter gehen und fragen wann sollte man eine abstrakte Basisklasse dafür definieren, also wann Interface, wann Basisklasse, wann gar nichts von beiden ?Überall steht es, dass Interface als eine spezielle Klasse angesehen werden kann