200 likes | 385 Views
Abstrakte Klassen, Interface. Beispiel: Vögel. Definition von Klassen enthält Abstraktion von den konkreten Objekten. Z.B.: Klasse: Vogel Kann ein Objekt der Klasse Vogel instanziiert werden? Nein, es gibt keine Vögel als solche, es gibt nur Spatzen, Enten, Kakadus, Strauße, Pinguine u.s.w.
E N D
Abstrakte Klassen, Interface DVG2 - 04 - Abstrakte Klassen, Interface
Beispiel: Vögel • Definition von Klassen enthält Abstraktion von den konkreten Objekten. • Z.B.: Klasse: Vogel • Kann ein Objekt der Klasse Vogel instanziiert werden? • Nein, es gibt keine Vögel als solche, es gibt nur Spatzen, Enten, Kakadus, Strauße, Pinguine u.s.w. • Vogel ist eine abstrakte Klasse. Die Klasse Vogel definiert allgemeine Eigenschaften aller Vögel. Um eine spezielle Vogelart zu beschreiben, werden zusätzliche Definitionen benötigt. Z.B.: • Flugfähigkeit • Farben des Gefieders, des Schnabels, der Beine • Größe, Gewicht u.s.w. • Aber: Um eine konkrete Vogelart beschreiben zu können, müssen diese Eigenschaften definiert werden. • Von dieser konkreten Vogelart gibt es dann auch konkrete Realisierungen. DVG2 - 04 - Abstrakte Klassen, Interface
Beispiel: Newton-Verfahren public class Equation { final double eps = 1e-12; public double solve(double x) { double dx; do { dx=-f(x)/fs(x); x+=dx; } while (Math.abs(dx) > eps*Math.abs(x)); return x; } } DVG2 - 04 - Abstrakte Klassen, Interface
Problem: • Bei der Definition der Methode solve werden die Methoden f und fs benötigt. • f und fs sind noch nicht bekannt • Lösung: • Bei der Definition von solve ist nur wichtig, welche Schnittstellen f und fs haben, nicht aber welchen Körper. • f und fs werden als abstrakte Methoden definiert, d.h. es wird nur der Methodenkopf mit dem Schlüsselwort abstract definiert. DVG2 - 04 - Abstrakte Klassen, Interface
publicabstractclass Equation { final double eps = 1e-12; public abstract double f (double x); public abstract double fs (double x); public double solve(double x) { double dx; do { dx=-f(x)/fs(x); x+=dx; } while (Math.abs(dx) > eps*Math.abs(x)); return x; } } DVG2 - 04 - Abstrakte Klassen, Interface
Die Klasse Equation ist noch abstrakt. • Es hat noch keinen Sinn mit der Klasse Equation ein Problem lösen zu wollen, da f und fs, und damit das zu lösende Problem, noch nicht beschrieben sind.==> Abstrakte Klassen sind nicht instanziierbar! • Um ein konkretes Problem lösen zu können muss eine „konkrete“ Klasse abgeleitet werden, die f und fs definiert. DVG2 - 04 - Abstrakte Klassen, Interface
public class ExpEquation extends Equation { final double rhs = Math.exp(Math.PI); public double f (double x) { return Math.exp(x) - rhs; } public double fs (double x) { return Math.exp(x); } } DVG2 - 04 - Abstrakte Klassen, Interface
Die Klasse ExpEquation ist nicht mehr abstrakt. • Von ExpEquation kann ein Objekt instanziiert werden. • Von diesem Objekt kann die Methode solve aufgerufen werden und damit die Gleichung gelöst werden. public class Newton01 { public static void main (String[]args) { ExpEquation ex = new ExpEquation(); System.out.println("Loesung = "+ex.solve(15.0)); } } DVG2 - 04 - Abstrakte Klassen, Interface
Vorteile abstrakter Klassen • Teile der Klassendefinition können von anderen Teilen getrennt und somit vor dem Anwender verborgen werden. • Z.B.: enthält die Klasse Equation unser ganzes know-how darüber, wie nichtlineare Gleichungen gelöst werden können. Dieses können wir vor dem Anwender verbergen. Er fügt nur die fehlenden Teile hinzu und kann sein konkretes Problem lösen. • Es bleibt die Überprüfung aller Schnittstellen durch das System garantiert. • Es sind keine fehlerhaften Aufrufe oder Parameterlisten möglich, da die Schnittstellen in der abstrakten Klasse definiert sind und in der abgeleiteten Klasse nicht verändert werden können (Überladung). DVG2 - 04 - Abstrakte Klassen, Interface
mehrfache Vererbung • Mehrfache Vererbung ist die Ableitung einer Klassen von mehreren anderen Klassen. • farbigerPunkt sollte eine Ableitung sowohl der Klasse Punkt als auch der Klasse Color sein.class farbigerPunkt extends Punkt,Color • Problem: • Elternklassen könnten die gleichen Methoden (Name, Parameterliste) definieren und diese verschieden implementieren. Welche Methode sollte dann verwendet werden?==> mehrfache Vererbung ist in JAVA nicht erlaubt • Interface • abstrakte Klasse • ausschließlich abstrakte Methoden • statische Konstanten DVG2 - 04 - Abstrakte Klassen, Interface
Interfacedefinition • Interfacedefinition besteht aus • Interfacekopf • Name des Interfaces • Modifizierer (public) • Ableitung von anderen Interfaces (extends) • Interfacerumpf • statische Attributealle Attribute bekommen automatisch die Modifiziererfinal public static • abstrakte Methodenalle Methoden bekommen automatisch die Modifizierer abstract public DVG2 - 04 - Abstrakte Klassen, Interface
Interfacekopf [public] interface Bezeichner [extends Interface ,...,Interface] implizit wird abstract angewendet • Interface können von mehreren anderen Interfacen erben.Kein Problem, da keine Implementierungen enthalten sind, sondern nur Schnittstellen. DVG2 - 04 - Abstrakte Klassen, Interface
Attribute Typ [ []...[] ] name = Initialisierer ; • Implizit werden public static final angewendet==> Attribute sind echte Konstanten • Attribute müssen immer initialisiert werden. DVG2 - 04 - Abstrakte Klassen, Interface
Methoden Typ Name ( [formaleParameterliste] ) [ []...[] ] [throws Ausnahme,...,Ausnahme] ; • Methoden sind immer public abstract==> keine Implementation DVG2 - 04 - Abstrakte Klassen, Interface
Newtonverfahren mit Interface public interface Function { double f(double x); double fs(double x); } DVG2 - 04 - Abstrakte Klassen, Interface
public class Equation { final double eps = 1e-12; public double solve(double x, Function func) { double dx; do { dx=-func.f(x)/func.fs(x); x+=dx; } while (Math.abs(dx) > eps*Math.abs(x)); return x; } } DVG2 - 04 - Abstrakte Klassen, Interface
public class ExpEquation implements Function { final double rhs = Math.exp(Math.PI); public double f (double x) { return Math.exp(x) - rhs; } public double fs (double x) { return Math.exp(x); } } DVG2 - 04 - Abstrakte Klassen, Interface
public class Newton01 { public static void main (String[]args) { Equation eq = new Equation(); ExpEquation ex = new ExpEquation(); System.out.println("Loesung = "+eq.solve(15.0, ex)); } } DVG2 - 04 - Abstrakte Klassen, Interface
Vorteile von Interfaces • Interface trennen die Definition der Schnittstellen von der Implementation der Algorithmen und Verfahren. • Änderungen der Implementierung haben daher keine Auswirkung auf andere Klassen. • Mehrfachvererbung von Interfacen ist möglich. DVG2 - 04 - Abstrakte Klassen, Interface