La programmation orientée objet avec des blocs fonction, en plus des possibilités d'extension via EXTENDS, rend possible l'utilisation d'interfaces et de l'héritage. Ceci nécessite la résolution dynamique des appels de méthode, aussi appelés appels de fonction virtuelle.
Un peu plus longs que les appels de fonction ordinaire, les appels de fonction virtuelle sont utilisés dans les situations suivantes :
oappel effectué par le biais d'un pointeur vers un bloc fonction (pfub^.method) ;
oappel d'une méthode de variable d'interface (interface1.method) ;
oappel d'une méthode par une autre méthode du même bloc fonction ;
oappel effectué par le biais d'une référence à un bloc fonction :
opossibilité d'affecter une instance de bloc fonction de type dérivé à la variable VAR_IN_OUT d'un bloc fonction de base.
Avec les appels de fonction virtuelle, il est possible qu'un même appel dans le code source d'un programme fasse appel à des méthodes différentes lors de l'exécution.
Pour plus d'informations et un examen détaillé, consultez les sections :
oMéthode pour obtenir des informations complémentaires sur les méthodes.
oPointeur THIS pour obtenir des informations sur l'utilisation du pointeur THIS.
oPointeur SUPER pour obtenir des informations sur l'utilisation du pointeur SUPER.
Conformément à la norme IEC 61131-3 , les méthodes telles que les fonctions ordinaires peuvent disposer de sorties supplémentaires. Elles peuvent être affectées dans l'appel de méthode avec la syntaxe suivante :
<méthode>(in1:=<valeur> |, autres entrées affectées, out1 => <variable de sortie 1> | out2 => <variable de sortie 2> | … autres variables de sortie)
De cette façon, la sortie de la méthode est consignée dans les variables déclarées localement comme indiqué dans l'appel.
Supposons que les blocs fonction fub1 et fub2 étendent (EXTEND) le bloc fonction fubbase et mettent en œuvre (IMPLEMENT) l'interface interface1. La méthode method1 est incluse.
Utilisation possible des interfaces et des appels de méthode :
PROGRAM PLC_PRG
VAR_INPUT
b : BOOL;
END_VAR
VAR
pInst : POINTER TO fubbase;
instBase : fubbase;
inst1 : fub1;
inst2 : fub2;
instRef : REFERENCE to fubbase;
END_VAR
IF b THEN
instRef REF= inst1; (* Reference to fub1 *)
pInst := ADR(instBase);
ELSE
instRef REF= inst2; (* Reference to fub2 *)
pInst := ADR(inst1);
END_IF
pInst^.method1(); (* If b is true, fubbase.method1 is called, else fub1.method1 is called *)
instRef.method1(); (* If b is true, fub1.method1 is called, else fub2.method1 is called *)
Supposons que le bloc fonction fubbase de l'exemple précédent contient deux méthodes : method1 et method2. fub1 remplace method2, mais pas method1.
La méthode method1 est appelée comme indiqué dans l'exemple précédent.
pInst^.method1(); (* If b is true fubbase.method1 is called, else fub1.method1 is called *)
Pour un appel par le biais du pointeur THIS, consultez la section Pointeur THIS.