继承与方法
继承类
使用 EXTENDS 从一个父类派生新类。类仅支持单继承,可以建立多层继承关系。
CLASS cDouble EXTENDS cCounter
METHOD PUBLIC OVERRIDE Add : DINT
Add := SUPER.Add() * 2;
END_METHOD
END_CLASS
编译器会检查循环继承。类不能直接或间接继承自身。
定义方法
方法使用 METHOD 和 END_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() 则执行父类原始逻辑。
备注
方法输入参数的默认值属于声明该方法的类。通过父类类型的指针调用派生实例时,方法的动态匹配不会改变参数默认值的声明位置。