Daniel Brenndörfer
Level-1
- Beiträge
- 9
- Reaktionspunkte
- 0
-> Hier kostenlos registrieren
Hallo zusammen,
ich bin auf ein Verhalten in Twincat gestoßen, das ich im Grunde für einen Bug halte. Vielleicht übersehe ich aber einfach irgendwas?
Ich habe zwei Function Blocks, FB_Parent und FB_Child. Letzteres EXTENDS ersteres. Beide haben je eine Methode, die ein Integer zurückliefert, die Child-Methode (Rückgabe "2") überschreibt also die Parent-Methode (Rückgabe "1").
Das funktioniert genau wie erwartet, solange ich die beiden Function Blocks nicht in ein Array schreibe:
MAIN:
Function Block Parent:
Function Block Child:
Ausgabe:
nParentDirect := 1
nChildDirect := 2
nParentArray := 1
nChildArray := 1
Man beachte die letzte Zeile. nChildArray wird erzeugt aus aFBArray[2], wo eigentlich fbChild abgelegt sein sollte. Der Rückgabewert, den ich erwarte, ist 2.
Ich kann also ohne Fehlermeldung fbParent und fbChild in ein Array packen, aber dann wird aus Child wieder Parent.
Ich kriege das ganze zum Laufen, indem ich stattdessen ein Interface definiere und auf Vererbung von Parent zu Child verzichte, aber das ist auch nicht ideal, weil ich dann Code doppelt ablegen muss, der normalerweise vererbt würde. Das Interface ist ja ohnehin schon eine Doppelung der Header des Function Blocks, und ich möchte doppelten Code soweit wie möglich vermeiden.
Ist das einfach so, oder mache/denke ich was falsch?
ich bin auf ein Verhalten in Twincat gestoßen, das ich im Grunde für einen Bug halte. Vielleicht übersehe ich aber einfach irgendwas?
Ich habe zwei Function Blocks, FB_Parent und FB_Child. Letzteres EXTENDS ersteres. Beide haben je eine Methode, die ein Integer zurückliefert, die Child-Methode (Rückgabe "2") überschreibt also die Parent-Methode (Rückgabe "1").
Das funktioniert genau wie erwartet, solange ich die beiden Function Blocks nicht in ein Array schreibe:
MAIN:
Code:
PROGRAM MAIN
VAR
fbParent : FB_Parent;
fbChild : FB_Child;
aFBArray : ARRAY[1..2] OF FB_Parent := [fbParent, fbChild];
nParentDirect : INT;
nChildDirect : INT;
nParentArray : INT;
nChildArray : INT;
END_VAR
_______________________________________________________________________
nParentDirect := fbParent.M_Method();
nChildDirect := fbChild.M_Method();
nParentArray := aFBArray[1].M_Method();
nChildArray := aFBArray[2].M_Method();
Function Block Parent:
Code:
FUNCTION_BLOCK FB_Parent
________________________________________________________________________
METHOD M_Method : INT
________________________________________________________________________
M_Method := 1;
Function Block Child:
Code:
FUNCTION_BLOCK FB_Child EXTENDS FB_Parent
________________________________________________________________________
METHOD M_Method : INT
________________________________________________________________________
M_Method := 2;
Ausgabe:
nParentDirect := 1
nChildDirect := 2
nParentArray := 1
nChildArray := 1
Man beachte die letzte Zeile. nChildArray wird erzeugt aus aFBArray[2], wo eigentlich fbChild abgelegt sein sollte. Der Rückgabewert, den ich erwarte, ist 2.
Ich kann also ohne Fehlermeldung fbParent und fbChild in ein Array packen, aber dann wird aus Child wieder Parent.
Ich kriege das ganze zum Laufen, indem ich stattdessen ein Interface definiere und auf Vererbung von Parent zu Child verzichte, aber das ist auch nicht ideal, weil ich dann Code doppelt ablegen muss, der normalerweise vererbt würde. Das Interface ist ja ohnehin schon eine Doppelung der Header des Function Blocks, und ich möchte doppelten Code soweit wie möglich vermeiden.
Ist das einfach so, oder mache/denke ich was falsch?