# lose Bindung/Koppelung von Klassen -ja wie jetzt?



## HannesG (25. Jun 2008)

Hallo,

wenn ich 2 klassen habe die gegenseitig Methoden von sich aufrufen, MUSS ich ja jeder Klasse ein Objekt der anderen Klasse mitgeben sonst geht das ja gar net... Wo ist das jetzt die lose Koppelung?


----------



## SlaterB (25. Jun 2008)

> Kopplung im Sinn von objektorientierter Programmierung (OOP) beschreibt den Grad der Abhängigkeiten zwischen Klassen. Man strebt für ein System eine möglichst lose Kopplung an, also ein System, in dem jede Klasse weitgehend unabhängig ist und mit anderen Klassen nur über möglichst schmale, wohldefinierte Schnittstellen kommuniziert. Lose Kopplung wird unter anderem durch Kapselung erreicht.


http://de.wikipedia.org/wiki/Kopplung_(Softwareentwicklung)

wenn sich also die Objekte gegenseitig nur als Interface kennen,
dann ist die Kopplung etwas loser als sonst,


----------



## HannesG (25. Jun 2008)

SlaterB hat gesagt.:
			
		

> > Kopplung im Sinn von objektorientierter Programmierung (OOP) beschreibt den Grad der Abhängigkeiten zwischen Klassen. Man strebt für ein System eine möglichst lose Kopplung an, also ein System, in dem jede Klasse weitgehend unabhängig ist und mit anderen Klassen nur über möglichst schmale, wohldefinierte Schnittstellen kommuniziert. Lose Kopplung wird unter anderem durch Kapselung erreicht.
> 
> 
> http://de.wikipedia.org/wiki/Kopplung_(Softwareentwicklung)
> ...




```
public class Eins
{
     public Eins()
    {

    }

}



public class Zwei
{
     public Zwei()
    {

    }  

}
```

kannst du mir zeigen, wie ich das mit den interfaces bei obigen Beispielklassen mache?


----------



## Tobias (25. Jun 2008)

```
public interface Action {

    public void doIt();

}
```


```
public class Eins {

    public Eins(Action a) {
        a.doIt();
    }

}
```


```
public class Zwei implements Action {

    public void doIt() {
        System.out.println("Do it!");
    }

}
```


```
public class Starter {

    public static void main(String[] args) {
        new Eins(new Zwei());
    }

}
```

Statt Zwei könnte man Eins auch eine beliebige andere Action-Implementierung übergeben, deshalb "lose Kopplung".

mpG
Tobias


----------



## HannesG (26. Jun 2008)

> public class Eins {
> 
> public Eins(Action a) {
> a.doIt();
> ...



was ich hier net verstehe, a ist ein Objekt eines Interface ohne new Operator ??? und a.doIt() führt eine Methode aus, obwohl die noch gar net überschrieben ist??? und class Eins implementiert gar nix ??

Versteh ich net ???:L


----------



## diggaa1984 (26. Jun 2008)

```
public interface Action {
    public void doIt();
}

public class SimpleAction implements Action {

    public SimpleAction() { ... }

    public void doIt() {
        System.out.println("SimpleAction hat was gemacht");
    }
}
```

klasse SimpleAction implementiert das interface, und definiert daher die Methode doIt des Interfaces.


```
public class Test {

    public static void main(String[] args) {
        Eins e = new Eins(new SimpleAction());
    }
}
```

in dem Moment übergibst du Eins beim Aufruf des Kontruktors ein Objekt welches das Interface realisiert. Somit kann e im Konstruktor die Methode des Action-Objektes aufrufen


----------



## Tobias (26. Jun 2008)

Quellcode kopieren, ausführen und Debugger mitlaufen lassen. Dann wird's klarer.

mpG
Tobias


----------



## ARadauer (26. Jun 2008)

> was ich hier net verstehe, a ist ein Objekt eines Interface ohne new Operator ??? und a.doIt() führt eine Methode aus, obwohl die noch gar net überschrieben ist??? und class Eins implementiert gar nix ??
> 
> Versteh ich net



Eins erbt nichit von zwei, es muss auch keine Methode überschrieben werden. Ein Objekt von Zwei wird Eins mitgegeben. das new findest du in der Klasse Starter...


----------



## HannesG (26. Jun 2008)

> Eins erbt nichit von zwei, es muss auch keine Methode überschrieben werden. Ein Objekt von Zwei wird Eins mitgegeben. das new findest du in der Klasse Starter...



Ok jetzt wurde es mir auch klarer stimmt das new ist ja i Konstruktor aufgerufe ok dank euch, mal schauen wo ich das wissen jetzt umsetzte


----------



## ARadauer (26. Jun 2008)

Grob ein Anwendungszweck:
Du hast eine Gui und ein Model Klasse für die Daten, ändern sich die Daten woll die Gui darüber informiert werden, sprich Model ruft eine Methode von Gui auf. Das Model hat nun ein Objekt von Gui. Tja, was ist jetzt, wenn du mehrer Guis (Ansichten) hast? zb in Excel die Tabellen Ansicht und ein Diagram.

Du könntest nun die Gui ein Interface implementieren lassen, dass die Methode beinhaltet, dass das Model bei geänderten Daten aufruft. Dieses Interface kann jetzt auch von anderen Guis implementiert werden und das Model kann eine ganze Liste von utnerschiedlichen Guis beinhalten, die bei einer änderung informiert werden sollen. Durch die Impelmentierung auf das Interface sind die Elemente lose gekoppelt. Das Model weiß nicht genau ob die Gui jetzt eine Tabelle oder ein Diagramm ist, es weis nur dass es, durch das Interface, ganz sicher ein Methode (zb werteGeändert() implementiert...usw blablaba


----------



## HannesG (27. Jun 2008)

ARadauer hat gesagt.:
			
		

> Grob ein Anwendungszweck:
> Du hast eine Gui und ein Model Klasse für die Daten, ändern sich die Daten woll die Gui darüber informiert werden, sprich Model ruft eine Methode von Gui auf. Das Model hat nun ein Objekt von Gui. Tja, was ist jetzt, wenn du mehrer Guis (Ansichten) hast? zb in Excel die Tabellen Ansicht und ein Diagram.
> 
> Du könntest nun die Gui ein Interface implementieren lassen, dass die Methode beinhaltet, dass das Model bei geänderten Daten aufruft. Dieses Interface kann jetzt auch von anderen Guis implementiert werden und das Model kann eine ganze Liste von utnerschiedlichen Guis beinhalten, die bei einer änderung informiert werden sollen. Durch die Impelmentierung auf das Interface sind die Elemente lose gekoppelt. Das Model weiß nicht genau ob die Gui jetzt eine Tabelle oder ein Diagramm ist, es weis nur dass es, durch das Interface, ganz sicher ein Methode (zb werteGeändert() implementiert...usw blablaba



ist das nicht das Observer Pattern, dass du gerade beschreibst?


----------

