类定义、成员与访问控制
定义普通类
使用 CLASS 开始类定义,使用 END_CLASS 结束类定义。成员变量和方法均写在类定义内部。
CLASS cCounter
VAR
Value : DINT;
END_VAR
VAR PUBLIC
Increment : DINT := 1;
END_VAR
METHOD PUBLIC Add : DINT
Value := Value + Increment;
Add := Value;
END_METHOD
END_CLASS
定义抽象类
抽象类用于声明由派生类实现的公共接口。抽象类不能直接实例化。
ABSTRACT CLASS cShape
METHOD PUBLIC ABSTRACT Area : LREAL
END_METHOD
END_CLASS
非抽象派生类必须实现继承的全部抽象方法,否则编译器会报告错误。
成员变量
类成员可以使用基础类型、字符串、数组、类实例和类指针。
CLASS cContainer
VAR
Enabled : BOOL;
Name : STRING(80);
Values : ARRAY[0..9] OF DINT;
Child : cCounter;
Parent : POINTER TO cContainer;
END_VAR
END_CLASS
每个类实例拥有独立的成员数据。类数组中的每个元素和嵌套的类成员也分别完成初始化,实例之间不会共享普通成员变量。
访问控制
| 声明方式 | 访问范围 |
|---|---|
VAR | 默认私有。只能由当前类的方法访问;同一个类的方法可以访问该类其他实例的私有成员。 |
VAR PUBLIC | 公有成员。可以通过类实例从外部读取或写入。 |
VAR PROTECTED | 保护成员。可以由当前类及其派生类访问,不能由无继承关系的外部代码访问。 |
CLASS cCounter
VAR
Value : DINT; (* 默认私有 *)
END_VAR
VAR PROTECTED
Minimum : DINT;
END_VAR
VAR PUBLIC
Increment : DINT := 3;
END_VAR
END_CLASS
编译器会阻止从类外部访问私有成员,以及从无继承关系的代码访问保护成员。
成员初始化
成员可以在声明时指定默认值:
VAR PUBLIC
Increment : DINT := 3;
END_VAR
声明实例时,可以使用初始化列表覆盖公有成员的默认值:
VAR
Counter1 : cCounter;
Counter2 : cCounter := (Increment := 5);
END_VAR
Counter1.Increment 使用类中的默认值 3,Counter2.Increment 使用实例初始化值 5。
注意
初始化列表只能设置允许从实例外部访问的成员。成员名称、数据类型或访问权限不正确时,编译器会报告错误。