DFBL-Benjamin Geschrieben 11. März 2003 Geschrieben 11. März 2003 für was braucht man Interfaces? mir ist nicht klar für was! Hier habe ich euch mal ein Bsp geschrieben, an dem könnt ihr es mir erklären! für mich sind Interfaces quatsch, weil ich damit noch nicht soviel Programmiert habe! hoffe mich kann einer von euch belehren! interface Ferrarie { public int getRaeder(); public String getFarbe(); } public class Auto implements Ferrarie { public int raeder; public String farbe; public Auto() { this.raeder = 4; this.farbe = "schwarz"; } public int getRaeder() { return this.raeder; } public String getFarbe() { return this.farbe; } } Zitieren
Snowghost Geschrieben 11. März 2003 Geschrieben 11. März 2003 Interfaces sind definitiv nicht sinnlos!!! Durch die Implementierung eines Interfaces verpflichtet sich eine Klasse, alle Methoden des Interfaces zu implementieren. Das Beispiel, das du genannt hast, ist vielleicht nicht ganz passend. Dreh, doch mal die Klasse und das Interface um - dann wird es vielleicht etwas sinnvoller. Also: - interface Auto - class Ferrari implements Auto Die Klasse Ferrari wäre in diesem Fall eine sog. Modell-Klasse, die sämtliche Daten und evtl. Businesslogik enthält. Willst du die Daten in einer Oberfläche anzeigen, wäre es sinnvoller, auf das Interface Auto zu casten und nur diese Methoden abzufragen/anzuzeigen. Dadurch kannst du mit der gleichen Oberfläche auch andere Modellklassen anzeigen, solange sie das Interface Auto implementieren. Bsp.: class BMW implements Auto; class Mercedes implements Auto etc.... Hoffe es ist jetzt etwas deutlicher - ansonsten schaust du am besten in Büchern nach der Definition von Interfaces. ciao Snowghost Zitieren
DFBL-Benjamin Geschrieben 11. März 2003 Autor Geschrieben 11. März 2003 danke es ist schon klarer! in meinem Javabuch steht es recht unverständlich drin! gibt es irgendein gutes Online-Book wo du mir vielleicht empfehlen kannst? Zitieren
Snowghost Geschrieben 12. März 2003 Geschrieben 12. März 2003 "Java ist auch eine Insel" "GoTo Java 2" Die Links findest du öfters in diesem Forum. So wirklich gut sind sie m.M. aber nicht. Am besten finde ich die Core Java-Bücher von SunPress. Snowghost Zitieren
DFBL-Benjamin Geschrieben 12. März 2003 Autor Geschrieben 12. März 2003 diese beiden Online-Books habe ich auch schon! ich habs glaube ich jetzt verstanden! Wenn ich jetzt mit implements ein Interface einbinde, dann werden nur die Methoden eingefügt bzw. benutzt, wo in dem Interface drin sind? wenn jetzt mehr Methoden in der Klasse sind z. B. in Ferrarie.java, wo Methoden dabei sind, wo nicht in Auto.java (=Interface) drin sind, kann ich dann auch nicht benutzen? stimmt das? hoffe, ich konnte es hoffentlich richtig erklären! Zitieren
Snowghost Geschrieben 12. März 2003 Geschrieben 12. März 2003 Bsp.: public interface Auto { public int getRaeder(); public int getPS(); } public class Ferrari implements Auto { public int getRaeder() { return 4; } public int getPS() { return 300; } public xyz getSonstwas() { return irgendwas; } } public class XYZ { private Auto myAuto; private Ferrari myFerrari // (schoen waers...) ----> auf die Variable myAuto kannst du nur Methoden aufrufen, die in dem Interface definiert sind -----> auf die Variable myFerrarie kannst du die Methoden des Interfaces aufrufen UND die zusätzlichen Methoden (hier: getSonstwas) } Zitieren
DFBL-Benjamin Geschrieben 12. März 2003 Autor Geschrieben 12. März 2003 irgendwie kann ich mit myAuto nicht auf die beiden Methoden zugreifen. muss ich da irgendetwas beachten? mein Code: public class Infos { private static Auto myAuto; public static void main(String [] args) { Ferarie myFerarie = new Ferarie(4, "schwarz"); System.out.println("Farbe: " + myFerarie.getFarbe()); System.out.println("Groesse: " + myFerarie.getGroesse()); System.out.println("================"); System.out.println("Raeder: " + myAuto.getRaeder()); // <--- Line 11 System.out.println("Farbe: " + myAuto.getFarbe()); } } ======================================== public class Ferarie implements Auto { public int raeder; public String farbe; public Ferarie() { this.raeder = 4; this.farbe = "blue"; } public Ferarie(int raeder, String farbe) { this.raeder = raeder; this.farbe = farbe; } public int getRaeder() { return this.raeder; } public String getFarbe() { return this.farbe; } public String getGroesse() { return "4"; } } ======================================== public interface Auto { public abstract int getRaeder(); public abstract String getFarbe(); } ich finde den Fehler nicht! Compilieren geht, aber dann bringt er in der Info.java eine NullPointerException in Line 11! irgend etwas muss ich noch falsch programmiert haben mit dem Zugriff myAuto! aber was? Zitieren
nopenta Geschrieben 12. März 2003 Geschrieben 12. März 2003 Folgender Fehler: myAuto ist keine Klasse! Nur myFerarie. Auf ein Interface kann man als Objekt in dem Sinne nicht zugreifen! Netter Gruss, nopenta private static Auto myAuto; // <----------------- hier (= null, zudem Interface) public static void main(String [] args) { Ferarie myFerarie = new Ferarie(4, "schwarz"); // <----- hier (= Objekt) Zitieren
Jaraz Geschrieben 12. März 2003 Geschrieben 12. März 2003 public class Main { public static void main(String[] args) { Dosentomaten d = new Dosentomaten(); Bierkaesten k = new Bierkaesten(); System.out.println("Volumen gesammt= "+(getVolumen(d)+getVolumen(k))+" cm³"); } public static int getVolumen(Verpackung p){ return p.getAnzahl()*p.getBreite()*p.getHoehe()*p.getLaenge(); } } public interface Verpackung { public int getLaenge(); public int getBreite(); public int getHoehe(); public int getAnzahl(); } public class Dosentomaten implements Verpackung { public int getLaenge() { return 10; } public int getBreite() { return 10; } public int getHoehe() { return 15; } public int getAnzahl() { return 200; } } public class Bierkaesten implements Verpackung { public int getLaenge() { return 40; } public int getBreite() { return 30; } public int getHoehe() { return 20; } public int getAnzahl() { return 50; } } Ohne das Interface, müsstest du die Funktion getVolumen für Bierkaesten und Dosentomaten implementieren. Gruß Jaraz Zitieren
SgtBadAzz Geschrieben 12. März 2003 Geschrieben 12. März 2003 Originally posted by Snowghost Interfaces sind definitiv nicht sinnlos!!! Durch die Implementierung eines Interfaces verpflichtet sich eine Klasse, alle Methoden des Interfaces zu implementieren. Das Beispiel, das du genannt hast, ist vielleicht nicht ganz passend. Dreh, doch mal die Klasse und das Interface um - dann wird es vielleicht etwas sinnvoller. Also: - interface Auto - class Ferrari implements Auto ciao Snowghost Das Beispiel ist nicht gut, Interfaces werden einfach dazu verwendet um Verhalten zu implementieren (Listener etc), dein Beispiel ist das klassische Vererbungsbeispiel, man würde Auto abstract machen und Ferrari würde dann von Auto erben, des weiteren können Interfaces keine Variabeln haben und deswegen können sie auch keinen Status wiederspiegeln und deshalb implementieren sie lediglich verhalten. Des weiteren hast du Methoden wie getPS() die sich auf ein member Element PS bezieht das es aber nicht gibt weil es in Interfaces das nicht geben kann. Frank Zitieren
SgtBadAzz Geschrieben 12. März 2003 Geschrieben 12. März 2003 Originally posted by Jaraz Ohne das Interface, müsstest du die Funktion getVolumen für Bierkaesten und Dosentomaten implementieren. Gruß Jaraz [/b] Genau das machst du ja, du implementierst es für Bierkaesten etc. Und das Beispiel ist auch nicht gut , genau wie das mit dem Auto. Getter und Setter haben in Interfaces nichts verloren da Interfaces keinen Status halten können. Frank Zitieren
nopenta Geschrieben 12. März 2003 Geschrieben 12. März 2003 Hi! Ich denke, getter und setter sind im Interface nicht verkehrt. Ein Interface erzwingt ja lediglich die Implementierung von Methoden. Was das für Methoden sind, ist nicht relevant. Ein Interface definiert Gemeinamkeiten, und damit (gerade ?) eben gemeinsame "Eigenschaften", die über getter und setter durchaus zugänglich sein können. Weiter: man kann eine Methode mit meinem Interface-typ aufrufen, unabhängig davon, welch konkretes Objekt dieses Interface gerade implementiert. Das spricht auch nciht gegen setter und getter. public void calculateSomething(MyInterface p_OmyObject) {...} public class Bla extends MyInterface (...) ... bla = new Bla(); calculateSomething(bla) .... Netter Gruss, nopenta Zitieren
Jaraz Geschrieben 12. März 2003 Geschrieben 12. März 2003 Es geht bei dem Beispiel auch nur darum, Das ein Object das vom Typ Verpackung ist, genau diese 4 Methoden besitzen muss, damit ich z.B. die Positionierung auf einer Palette berechnen kann oder wie geschehen, das Volumen. Das hier nun nur fest definierte ints zurückgegeben werden ist natürlich nicht zwingend. Die Werte könnten bei Dosentomaten z.B. abhängig vom Inhalt der Dosentomaten sein. Es gibt halt Dosen mit 480 ml und mit 800 ml. Ebenso gibt es Bierkaesten, mit 0,33 0,5 oder 1 Liter Flaschen. Auch da varieren die Werte. Das ein Interface auch als eine super Klasse geschrieben werden kann, sollte auch klar sein. Falls aber schon eine super Klasse existiert, die nichts mit den gewünschten Eigenschaften zu tun hat, muss man mit Interfaces weiterarbeiten. Gruß Jaraz Zitieren
SgtBadAzz Geschrieben 13. März 2003 Geschrieben 13. März 2003 Originally posted by Jaraz Es geht bei dem Beispiel auch nur darum, Das ein Object das vom Typ Verpackung ist, genau diese 4 Methoden besitzen muss, damit ich z.B. die Positionierung auf einer Palette berechnen kann oder wie geschehen, das Volumen. Gruß Jaraz Trotzdem haben getter und setter darin nicht verloren. Des weiteren ist die Methode getVolumen() sehr unglücklich gewählt wenn man die als Static in die Main Klasse macht, die sollte eben ein teil der abstrakten Klasse sein. Sieh dir mal Interfaces im JDK an , dann wirst du sehen dass die zum Grossteil nur Konzepte und Verhalten implementieren und nichts mit getX() usw. haben. Frank Zitieren
SgtBadAzz Geschrieben 13. März 2003 Geschrieben 13. März 2003 Originally posted by nopenta Hi! Ich denke, getter und setter sind im Interface nicht verkehrt. Ein Interface erzwingt ja lediglich die Implementierung von Methoden. Was das für Methoden sind, ist nicht relevant. Ein Interface definiert Gemeinamkeiten, und damit (gerade ?) eben gemeinsame "Eigenschaften", die über getter und setter durchaus zugänglich sein können. Weiter: man kann eine Methode mit meinem Interface-typ aufrufen, unabhängig davon, welch konkretes Objekt dieses Interface gerade implementiert. Das spricht auch nciht gegen setter und getter. public void calculateSomething(MyInterface p_OmyObject) {...} public class Bla extends MyInterface (...) ... bla = new Bla(); calculateSomething(bla) .... Netter Gruss, nopenta Laut BDK ist es geben definiert das getter und setter auf die entsprechenden Elemente der Klasse zugreifen (z.b. getName() greift auf ein Element Name zu), Interfaces haben keine Elemente, Interfaces repräsentieren Konzepte und Verhalten aber keine konkreten Entities, da sie keinen Status speichern können. Dein Beispiel mit Bla extends MyInterface ist FALSCH, Interfaces können kein Superklassen von Klassen sein. Interfaces implementieren keine Objekte , Interfaces werden implementiert. Frank Zitieren
SgtBadAzz Geschrieben 13. März 2003 Geschrieben 13. März 2003 Originally posted by nopenta Hi! Ein Interface definiert Gemeinamkeiten, und damit (gerade ?) eben gemeinsame "Eigenschaften", die über getter und setter durchaus zugänglich sein können. Netter Gruss, nopenta Wie gesagt, da ein Interface keine Elemente besitzen kann die einen Status halten können machen getter und setter keinen Sinn. Ich empfehle hierzu die Lektüre des Buches "Effective Java". Interfaces definieren oder modellieren vielmehr ein Konzept oder ein Verhalten was dann ohne Wissen der Implementation benutzt werden kann. Im JDK habe ich bisher kein Interface gefunden was getXCY() als Methode hat. Frank Zitieren
Snowghost Geschrieben 13. März 2003 Geschrieben 13. März 2003 Originally posted by SgtBadAzz .... Interfaces definieren oder modellieren vielmehr ein Konzept oder ein Verhalten was dann ohne Wissen der Implementation benutzt werden kann. Im JDK habe ich bisher kein Interface gefunden was getXCY() als Methode hat. Frank Dann solltest du dir mal z.B. das Interface javax.swing.tree.TreeModel anschauen (oder andere Modell-Schnittstellen) - dort sind nämlich Methoden wie getRoot, getChild oder isLeaf vorhanden..... Interfaces kann man in Java schliesslich für sehr vieles verwenden. Natürlich ist ein Hauptverwendungszweck der, dass ein Verhalten ohne Wissen der Implementierung benutzt werden kann. Aber Interfaces werden nun mal auch oft verwendet, um Modellklassen zu strukturieren und im Controller oder der View unabhängig von der Modell-Implementierung zu sein (Stichwort MVC). Snowghost Zitieren
SgtBadAzz Geschrieben 13. März 2003 Geschrieben 13. März 2003 Originally posted by Snowghost Dann solltest du dir mal z.B. das Interface javax.swing.tree.TreeModel anschauen (oder andere Modell-Schnittstellen) - dort sind nämlich Methoden wie getRoot, getChild oder isLeaf vorhanden..... Snowghost getRoot() modelliert auch wieder das Konzept ... hier Baum, selbiges mit isLeaf(). Des weiteren wurde in der Vergangenheit zugegeben das Swing und AWT einige Hoaxes haben was das Design angeht. Da wird das Konzept eines Baumes implementiert, ich bezog mich aber mehr auf die Namenskonventionen nach dem BDK. Frank Zitieren
Jaraz Geschrieben 13. März 2003 Geschrieben 13. März 2003 Originally posted by SgtBadAzz Trotzdem haben getter und setter darin nicht verloren. Des weiteren ist die Methode getVolumen() sehr unglücklich gewählt wenn man die als Static in die Main Klasse macht, die sollte eben ein teil der abstrakten Klasse sein. Ich kann auch ein Programm mit 10 Klassen als Beispiel schreiben, nur dann wird es unübersichtlich. Originally posted by SgtBadAzz Sieh dir mal Interfaces im JDK an , dann wirst du sehen dass die zum Grossteil nur Konzepte und Verhalten implementieren und nichts mit getX() usw. haben. # interface javax.swing.text.AbstractDocument.AttributeContext # interface javax.swing.text.AbstractDocument.Content # interface javax.accessibility.Accessible # interface javax.accessibility.AccessibleAction # interface javax.accessibility.AccessibleComponent Die ersten 5 Interfaces haben alle getFunktionen. Du verstehst einfach nicht, das mein Beispiel bei der Rückgabe von einem int aufhört. Du könntest auch ein eigenes Object vom Typ Laenge zurück liefern, trotzdem heißt die Funktion dann im Interface immer noch getLaenge(). Oder siehst du eine private Variable laenge im Interface? Beispiel Interface von Sun: http://java.sun.com/docs/books/tutorial/java/interpack/QandE/TimeClient.java public interface TimeClient { public void setTime(int hour, int minute, int second); public void setDate(int day, int month, int year); public void setDateAndTime(int day, int month, int year, int hour, int minute, int second); } Noch Fragen? Gruß Jaraz PS: Das Auto Ferrari Beispiel war wirklich nicht OK. Zitieren
SgtBadAzz Geschrieben 13. März 2003 Geschrieben 13. März 2003 Originally posted by Jaraz public interface TimeClient { public void setTime(int hour, int minute, int second); public void setDate(int day, int month, int year); public void setDateAndTime(int day, int month, int year, int hour, int minute, int second); } Noch Fragen? Gruß Jaraz PS: Das Auto Ferrari Beispiel war wirklich nicht OK. Ich habe ein Interview gesehen auf theserverside.com mit verantwortlichen von SUN fuer die API und da wird zugegeben dass nicht ok ist was da teilweise gemacht wird mit Swing usw.. Zweimal Falsch machen noch kein Richtig. Frank Zitieren
Jaraz Geschrieben 13. März 2003 Geschrieben 13. März 2003 Wie willst du es denn dann nennen, wenn du über eine Interface Methode ein Object holst oder setzt? Gruß Jaraz Zitieren
SgtBadAzz Geschrieben 13. März 2003 Geschrieben 13. März 2003 Originally posted by Jaraz Wie willst du es denn dann nennen, wenn du über eine Interface Methode ein Object holst oder setzt? Gruß Jaraz Es macht oft keinen Sinn was als ein Interface zu machen, besonders wenn das Interface mal publiziert wurde macht es riesige Probleme es nochmal zu ändern, weil dann der Vertrag gebrochen wird und nichts mehr richtig läuft. Teilweise ist dann eine abstrakte Klasse besser, weil da kann ich das machen indem ich eine Default-Implementation mitliefere. Frank Zitieren
Jaraz Geschrieben 13. März 2003 Geschrieben 13. März 2003 In Java ist aber keine Mehrfachvererbung möglich, deswegen gibt es ja Interfaces. Sicher kann man jedes Interface auch als abstrakte Klasse umschreiben. Mehrere Interfaces in eine abstracte Klasse zu packen, dürfte schwierig werden. Gruß Jaraz Zitieren
SgtBadAzz Geschrieben 13. März 2003 Geschrieben 13. März 2003 Originally posted by Jaraz In Java ist aber keine Mehrfachvererbung möglich, deswegen gibt es ja Interfaces. Sicher kann man jedes Interface auch als abstrakte Klasse umschreiben. Mehrere Interfaces in eine abstracte Klasse zu packen, dürfte schwierig werden. Gruß Jaraz Es macht auch Sinn das es keine Mehrfachvererbung gibt, wenn man da an C++ denkt dann kann einem das schon in den Wahnsinn treiben. Aber lies mal das Buch "Effectice Java", das zeigt dir das man solche Sachen wie hier beschrieben mit Interfaces nicht machen sollte. Frank Zitieren
Jaraz Geschrieben 14. März 2003 Geschrieben 14. März 2003 Originally posted by SgtBadAzz Aber lies mal das Buch "Effectice Java", das zeigt dir das man solche Sachen wie hier beschrieben mit Interfaces nicht machen sollte. Gut, habe ich. Habe aber keine Stelle gefunden, die deine Ansicht belegt. Also, auf was für ne Aussage im Buch beziehst du dich. Gruß Jaraz Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.