# Interface vs. Object ??



## Plea (2 Oktober 2010)

Hallo miteinander!!​ Ich habe folgendes unter Codesys programmiert.
Ich verstehe anscheind  noch nicht so ganz den Vorteil eines Interfaces.
Könnt Ihr mir  vielleicht die beiden unterschiedlichen Ergebnisse erklären?
Hoffe der Code ist verständlich.
Vielen Dank...

PROGRAM Main1
VAR
   x:ARRAY [1..5]OF Beispiel;
   y1:Beispiel;
   y2:Beispiel_1;
   Result:STRING:='00';
END_VAR

y1:=y2;
x[1]:=y1;
Result:=x[1].example(); --> 11
_____________________________

PROGRAM Main2
VAR
   x:ARRAY [1..5]OF IBeispiel;
   y1:IBeispiel;
   y2:Beispiel_1;
   Result:STRING:='00';
END_VAR

y1:=y2;
x[1]:=y1;
Result:=x[1].example(); --> 22


_____________________________________

Aufbau bei für beide Programme gleich:

IBeispiel (Interface) mit Mehtode example

Beispiel (FB) Implements IBeispiel
    mit Methode example:STRING
    example:='11';

Beispiel_1 (FB) Extends Beispiel
    mit Methode example:STRING
    example:='22';


----------



## Werner29 (4 Oktober 2010)

Im ersten Fall hast du ein Array von Instanzen angelegt und dann eine Zuweisung von einer Instanz auf eine andere unternommen.

y1:=y2;       // y1 ist eine gültige Instanz du kopierst hier nur die Werte von y2 nach y1 (eine inhaltliche Kopie)
x[1]:=y1;     // hier ebenfalls: x[1] ist eine gültige Instanz, du kopierst nochmal die Wert aus y1 nach x[1]
Result:=x[1].example(); --> 11  // diesen Aufruf hättest du auch ohne die vorherige kopiererei machen können

Im zweiten Fall hast du ein Array von Referenzen auf Instanzen (über die Interfaces) angelegt und dann dieser Referenz einen echten Wert zugewiesen.
y1:=y2;      // y1 bekommt hier nur eine Referenz auf die Instanz von y2
x[1]:=y1;    // hier kopierst du nochmal diese Referenz nach x[1] 
Result:=x[1].example(); --> 22  // hier rufst du über die Referenz eigentlich die Instanz von y2 auf. Ohne vorhergehende Zuweisung auf eine Referenz erhältst du zur Laufzeit eine Exception.

Wenn du eine Variable vom Typ Interface deklarierst, dann kannst du damit erst was damit anfangen wenn du dieser Variable eine konkrete Instanz zuweist. Der "Gag" hierbei ist, dass du eine beliebige Instanz eines beliebigen FB's verwenden kannst, solange er das Interface implementiert.
Das klassische Beispiel ist, du hast ein Interface für eine Achse "IAxis" und kannst über dieses Interface eine Reihe von Positionierbefehlen aufrufen egal was für eine implementierung in Wirklichkeit hinter der Achse steht.


----------



## Plea (4 Oktober 2010)

Vielen Dank für die schnelle Antwort!!!

Mit Exception ist dann gemeint, das ich nur zur Laufzeit eine Erkennung und die anschließende Signalisierung eines Fehlerzustands erhalte und beim Übersetzen über den Debugger noch nicht??


----------



## Werner29 (4 Oktober 2010)

die schnelle Antwort ist Zufall, ich schau unregelmässig ins Forum und suche nach "CoDeSys"...

Aber genau, um eine Exception zu vermeiden, solltest du ein Interface immer erst auf <> 0 testen bevor du darauf zugreifst.

Bernhard


----------



## RobiHerb (5 Oktober 2010)

*Verständnis*



Werner29 schrieb:


> ...
> Wenn du eine Variable vom Typ Interface deklarierst, dann kannst du damit erst was damit anfangen wenn du dieser Variable eine konkrete Instanz zuweist. Der "Gag" hierbei ist, dass du eine beliebige Instanz eines beliebigen FB's verwenden kannst, solange er das Interface implementiert.



Muss man dazu einen Zuweisungs Operator definieren oder ist das implizit mit der Implementation des Interfaces geschehen?


----------



## Werner29 (5 Oktober 2010)

Das passiert implizit. Also jeder Interface-Referenz kann jede Instanz eines FB's der dieses Interface implementiert zugewiesen werden. Das geht auch über Vererbungshierarchien hinweg.
Der Compiler testet, dass das Interface korrekt implementiert wurde.


----------



## Ralle (5 Oktober 2010)

Schön schön, toll, was nun so alles geht, ich seh schon die zerdemmelten Achsen und Anlagenteile in den Schrott wandern1


----------



## Werner29 (6 Oktober 2010)

Keiner wird gezwungen. Und wer bisher schon mit Pointer gearbeitet hat, kennt die Probleme und da bieten Interfaces eigentlich mehr Sicherheit.


----------

