Interface vs. Object ??

Plea

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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';
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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??
 
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
 
Verständnis

...
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Schön schön, toll, was nun so alles geht, ich seh schon die zerdemmelten Achsen und Anlagenteile in den Schrott wandern1 :ROFLMAO:
 
Keiner wird gezwungen. Und wer bisher schon mit Pointer gearbeitet hat, kennt die Probleme und da bieten Interfaces eigentlich mehr Sicherheit.
 
Zurück
Oben