Zum Inhalt springen

Interfaces


DFBL-Benjamin

Empfohlene Beiträge

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;

}

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen


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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...