跳到主要内容

继承与方法

继承类

使用 EXTENDS 从一个父类派生新类。类仅支持单继承,可以建立多层继承关系。

CLASS cDouble EXTENDS cCounter
METHOD PUBLIC OVERRIDE Add : DINT
Add := SUPER.Add() * 2;
END_METHOD
END_CLASS

编译器会检查循环继承。类不能直接或间接继承自身。

定义方法

方法使用 METHODEND_METHOD 定义。带返回值的方法需要在方法名称后声明返回类型,并向方法名赋值。

METHOD PUBLIC Add : DINT
VAR_INPUT
Step : DINT := 1;
END_VAR

Value := Value + Step;
Add := Value;
END_METHOD

无返回值的方法不声明返回类型:

METHOD PUBLIC Reset
Value := 0;
END_METHOD

方法变量

变量段说明
VAR_INPUT输入参数。可以声明默认值;调用时可以按位置或名称传入。
VAR_OUTPUT输出参数。调用时使用 => 将输出写入外部变量。
VAR_IN_OUT引用参数。方法直接访问调用方传入的变量或类实例。
VAR方法内部局部变量。
VAR_EXTERNAL引用全局变量。全局变量必须已经在全 ST 工程中声明。

调用示例:

result1 := counter.Add(2);               (* 位置参数 *)
result2 := counter.Add(Step := 3); (* 具名参数 *)
result3 := counter.Add(); (* 使用默认值 *)
worker.Execute(Value := 10, Done => ok); (* 捕获输出参数 *)

VAR_IN_OUT 为引用传递。方法内修改类参数的成员时,会同步修改外部原实例。

OVERRIDE、THIS 与 SUPER

关键字说明
OVERRIDE表示派生类方法重写父类中签名相同的方法。签名不匹配时编译失败。
THIS表示当前实例。THIS.Method() 会根据实例的实际类型调用对应的重写方法。
SUPER表示父类实现。SUPER.Method() 直接调用父类方法,不执行当前派生类的重写版本。
CLASS cCounter
METHOD PUBLIC AddTwice : DINT
AddTwice := THIS.Add();
AddTwice := THIS.Add();
END_METHOD
END_CLASS

CLASS cDouble EXTENDS cCounter
METHOD PUBLIC OVERRIDE Add : DINT
Add := SUPER.Add() * 2;
END_METHOD
END_CLASS

cDouble 实例执行父类定义的 AddTwice() 时,其中的 THIS.Add() 会调用 cDouble.Add()cDouble.Add() 内的 SUPER.Add() 则执行父类原始逻辑。

备注

方法输入参数的默认值属于声明该方法的类。通过父类类型的指针调用派生实例时,方法的动态匹配不会改变参数默认值的声明位置。