Para admitir la programación orientada a objetos, un bloque de funciones puede implementar varias interfaces que permiten utilizar métodos.
FUNCTION_BLOCK <nombre de bloque de funciones> IMPLEMENTS <nombre de interfaz_1>|,<nombre de interfaz_2>, ..., <nombre de interfaz_n>
Un bloque de funciones que implementa una interfaz debe contener todos los métodos y propiedades (propiedades de interfaz) definidas por esa interfaz. Se incluyen el nombre, las entradas y la salida del método o propiedad concretos, que deben ser exactamente los mismos.
Por este motivo, al crear un nuevo bloque de funciones que implemente una interfaz, todos los métodos y propiedades definidos en esa interfaz se insertarán automáticamente debajo del nuevo bloque de funciones en el árbol
.Al utilizar la herencia para bloques de funciones, si se crearon métodos o atributos por herencia de una interfaz, impleméntelos o elimínelos si se va a utilizar el bloque de funciones base. Los atributos de pragma se insertan automáticamente. Estos se detectan durante la compilación y se generan mensajes para recordarle que se deben verificar los métodos o las propiedades heredados. Elimine los atributos de pragma después de haber implementado por completo el nuevo bloque de funciones.
Para obtener más información, consulte la descripción del comando .
INTERFACE I1
incluye el método GetName
:
METHOD GetName : STRING
Los bloques de funciones A
y B
implementan cada uno de ellos la interfaz I1
:
FUNCTION_BLOCK A IMPLEMENTS I1
FUNCTION_BLOCK B IMPLEMENTS I1
Así, en los dos bloques de funciones, el método GetName
debe estar disponible y se insertará automáticamente debajo de cada uno cuando los bloques de funciones se inserten en el árbol .
Tenga en cuenta esta declaración de una variable de tipo I1
:
FUNCTION DeliverName : STRING
VAR_INPUT
l_i : I1;
END_VAR
Esta entrada puede recibir todos los bloques de funciones que implementan la interfaz I1
.
Ejemplo de llamadas a funciones:
DeliverName(l_i := A_instance); // call with instance of type A
DeliverName(l_i := B_instance); // call with instance of type B
De este modo, una llamada al método de interfaz produce una llamada a la implementación del bloque de funciones. En cuanto se asigna la referencia, la dirección correspondiente se supervisa en modalidad online. En caso contrario, si todavía no se ha asignado ninguna referencia, se mostrará el valor 0 en la supervisión en modalidad online.
Para este ejemplo, consulte la parte de implementación de la función DeliverName
:
DeliverName := l_i.GetName(); // in this case it depends on the "real" type of l_i whether A.GetName or B.GetName is called
EXTENDS
en la declaración.