WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   [Java] Interface - wozu? (http://www.wcm.at/forum/showthread.php?t=106399)

moorhahn 22.08.2003 17:03

[Java] Interface - wozu?
 
wozu sind interfaces in java? die theoretische beschreibung is schon klar, in den meisten tutorials oder büchern steht in etwa, dass interfaces dazu da sind, um etwas ähnliches wie die merhfachvererbung (die es in java ja nicht gibt) in java zu verfügung zu haben. denn ohne merhfachvererbung müsste man ja in manchen fällen gleichen code doppelt schreiben, und das würde quasi gegen eine konvention verstoßen und wäre ja auch völlig dämlich, man müsste ja dann bei einer änderung jede methode ändern.
aber wie soll dieses problem durch interfaces beseitigt werden (was ja laut büchern und tutorials der sinn von interfaces wäre), wenn man die methoden sowieso in jeder klasse wieder neu implementieren muss.

von http://java.programmersbase.net/ folgendes beispiel:

Code:

interface MyInterface1
{       
  public void print1();
}
interface MyInterface2 extends MyInterface1
{       
  public void print2();
}

class MySuperClass
{               
  protected String s = "ProgrammersBase.NET";
}

class MySubClass extends MySuperClass
implements MyInterface2
{
  public void print1()
  {
    System.out.println(s);
  }
  public void print2()
  {
    System.out.println("ProgrammersBase.DE");
  }
}

public class MyClass
{
  public static void main(String[] args)
  {         
    MySubClass object = new MySubClass();
   
    object.print1();
    object.print2();
  }
}


dieses beispiel könnte man genauso gut ohne interfaces schreiben.

wozu also dann diese interfaces?

käptn 22.08.2003 17:08

Re: [Java] Interface - wozu?
 
Zitat:

Original geschrieben von moorhahn
dieses beispiel könnte man genauso gut ohne interfaces schreiben.

wozu also dann diese interfaces?

Für mich sind Interfaces eine Art Vertrag, dass ein Klasse eine gewisse Funktionalität implementiert.

~

moorhahn 22.08.2003 17:16

weiß ned wirklich was du damit meinst, hört sich aber in etwa so an, als seien interfaces programmiertechnisch eigentlich sinnlos.

Seidl 22.08.2003 19:34

Mit einem Interface definierst du eine Art Grundfunktionalität die eine Klasse zur Verfügung stellen muss, wenn sie das Interface implementieren will. Auf diese Art könntest du zum Beispiel ein Frontend für ein Programm schreiben ohne selbst wirklich auf die Hintergrunddetails einzugehen. Das Implementieren dieses Teils überlässt du einem Kollegen der eine Klasse schreibt, die das von dir definierte Interface implementiert. Nachdem dein Programm dann ein Jahr lang gelaufen ist kommst du dahinter, dass dein Kollege ein sogenannter Vollnubbler war und das Programm Fehler aufweist. Als Ausweg schreibst du einfach wieder eine neue Klasse die dein Interface implementiert und hängst sie hinter dein Frontend. Problem gelöst.
Man muss sich immer vor Augen halten, dass der Einzelkämpfer-Programmierer nicht unbedingt die Regel ist. In einem Team machen viele Sachen Sinn die für einen allein absolut sinnlos scheinen.


Seit meiner Ausbildung muss ich mich leider grösstenteils als Wald- und Wiesen-Programmierer betätigen und habe nur selten Gelegenheit mit anderen Leuten zu arbeiten die Ahnung vom Programmieren haben. Aus diesem Grund würde ich auf die Korrektheit meiner Erklärung kein Geld verwetten aber ich bin mir recht sicher, dass ich den Kern so ziemlich getroffen habe.

K@sperl 22.08.2003 19:49

Ein Interface zeigt nichts anderes als die Methoder einer Klasse, sehe ich das richtig?

kju 22.08.2003 19:51

Zitat:

Original geschrieben von moorhahn
weiß ned wirklich was du damit meinst, hört sich aber in etwa so an, als seien interfaces programmiertechnisch eigentlich sinnlos.
nein im gegenteil interfaces werden in java sehr häufig verwendet und spielen daher eine wichtige rolle! z.b.: beim Eventhandling (EventListener, ActionListener, KeyListener,
MouseListener, MouseMotionListener, usw.) oder Objektserialisierung (Serializable) ...

moorhahn 22.08.2003 20:45

ja, klar sie sind anscheinend wichtig, aber wie bei obigem beispiel ersichtlich, könnte mans genausogut ohne interface machen.

@seidl: ein interface hat also nix damit zu tun, die in java nicht mögliche mehrfachvererbung zu ersetzen?

käptn 22.08.2003 21:34

Stell dir vor du schreibst ein Programm.

Stell dir vor andere sollen dafür PlugIns schreiben können.

Nun stellst du ihnen ein Interface zur verfügung, das die anderen implementieren müssen.

Code:

public interface IPlugin {
    PluginStatus status {
        get {}
    }
    void start();
    void stop();
}

Das ist zwar C#, kann aber nicht soviel Unterschied zu Java sein.

Damit kannst du überprüfen, ob ein Plugin das Interface implementiert und die entsprechenden Methoden/Eigenschaften bietet.

~

Tarjan 22.08.2003 23:27

Also die Erklärung von Seidl ist schon sehr gut. Nur etwas auf unterschiedliche Programmierer ausgerichtet ;).

Interface ist eben eine Schnittstelle. Die tatsächliche Implementierung erfolgt dann in den Klassen die die Schnitstelle implementieren. Wird mit der Schnittstelle gearbeitet, so interessiert die tasächliche Implementierung nicht, nur das Interface.

Beispiel aus meinen Projekt: Alle Datenbankzugriffe sind in Interfaces gekapselt. Die stellen die Methoden und werden von Factories zurückgeliefert. Die tasächliche Implementierung der Funktionalität, in meinen Beispiel für die DB2 Datenbank sind in Klassen, die die Interfaces implementieren. Soll das ganze jetzt zB. mit Oracle auch funktionieren, so werden einfach neue Klassen geschrieben, die eben die Oraclefunktionalität implementieren. Die Factories liefern dann diese zurück. Der Programmierer der die Datenbankinterfaces verwendet merkt davon überhaupt nichts, da er ja mit den Interfaces arbeitet und ihn die Implementierung für welche Datenbank auch immer nicht interessiert.

Das lässt sich natürlich auf jeden Bereich anwenden.

Who-T 23.08.2003 05:15

Anderes beispiel:

du hast eine ArrayList, die du durchlaufen willst.

Code:

ArrayList al = new ArrayList();
// fill arraylist with data
Iterator it = al.iterator();

was du jetzt hast ist ein iterator. und wenn du dir die api-doc ansiehst kommst du drauf dass Iterator ein interface ist.

was heißt das jetzt für dich?

du weißt dass du eine instanz einer bestimmten klasse bekommen hast (weil instanzen von interfaces gibt es nicht).
allerdings weißt du nicht was für eine klasse - aber, und das ist das entscheidende für dich - es kann dir wurscht sein weil du weißt, dass diese klasse alle methoden des interfaces Iterator implementiert hat. wie - das kann dir auch wieder wurscht sein.

wenn du iterator() an einer anderen collection aufrufst, kriegst du eine instanz einer womöglich ganz anderen klasse zurück. aber du kannst mit den in Iterator definierten methoden wieder durch deine collection laufen.

genau darum gehts - ein anderer programmiert was für dich, wie er das macht interessiert dich nicht, hauptsache er gibt dir eine standardisierte schnittstelle über die du zugreifen kannst.

moorhahn 23.08.2003 09:22

ok, soweit verstanden, danke euch für die erklärungen.

aber trotzdem nochmal die frage: interfaces haben also nicht wirklich was damit zu tun, die mehrfachvererbung zu ersetzen?

@who-t: es ist also quasi möglich, für ne variable als typ ein interface anzugeben, welche klasse damit dann insttanziert wird, ist aber wurscht, solange die instanzierte klasse das interface implementiert?

Tarjan 23.08.2003 10:00

Ne, mit Mehrfachvererbung haben Interfaces nicht so viel zu tun. Man kann Mehrfachvererbung damit realisieren, aber dafür extra wurden sie nicht eingeführt.

Ja, in der Deklaration ist nur das Interface angegeben. Welche wirklich Insatanz du dann bekommst ist dir egal. Das Interface ist praktisch die Mutterklasse.

moorhahn 23.08.2003 11:14

ok, danke.

Who-T 24.08.2003 13:41

@Tarjan:
ich hätte mir gedacht (auch von mehreren quellen schon gehört) dass interfaces genau aus dem grund eingeführt worden, weil mit abstrakten klassen (bzw überhaupt) keine mehrfachvererbung möglich war.

mir ist schon klar dass interfaces net wirklcih mehrfachvererbung zulassen (weil die methoden ja neu geschrieben werden müssen) aber trotzdem...

Tarjan 24.08.2003 13:49

Da bin ich nicht der Meinung.

Gute Objektorientierte Packete definieren einen Satz von Interfaces. Und dazu dann Defaultimplenentierungen bzw. spezielle Klassen für verschiedene Anwendungen.

Methoden die dann mit diesen Klassen arbeiten sollten, wenn möglich, und nicht die speziellen Eigenschaften gebraucht werden mit den Interfaces arbeiten.

Mehrfachvererbung sollte sowieso vermieden werden, da man sich jede Menge Probleme einhandel kann. Mit der Interfacemehrfachvererbung kann man diese aber umgehen.

Sesa_Mina 24.08.2003 14:28

So. Ich verstehe interfaces so, dass ich damit im Prinzip die "Pinbelegung" eines Anschlusses definiere und das dazugehörige "Protokoll".

Somit kann jeder beliebige Programmierer der die Pinbelegung und das Protokoll kennt für den Anschluss einen passenden "Stecker" in sein Programm einbauen.

Damit kann dann mein Programm mit dem "angeschlossenen" Programm kommunizieren. Und auch mit anderen Programmen die über ebendiesen "Stecker" verfügen.

:cool:

(So würde ichs zumindest jemandem Erklären der sich damit nicht auskennt)

Tarjan 24.08.2003 15:58

Recht anschaulich die Erklärung ;).

Vielleicht noch dazu, ist im Prinzip der Stecker und Protokoll, ohne zu wiessen was in der Box dahinter ist.

Sesa_Mina 24.08.2003 17:19

Abstrakte Dinge sind oft schwer verständlich. Darum versuche ich Analogien zu finden bzw herzustellen. Und zwar zu Dingen die einfacher zu verstehen sind :)

Hat schon oft "gehilft" wo herkömmliche Methoden nichts gebracht haben :)


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag