跳到主要内容

类定义、成员与访问控制

定义普通类

使用 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 使用类中的默认值 3Counter2.Increment 使用实例初始化值 5

注意

初始化列表只能设置允许从实例外部访问的成员。成员名称、数据类型或访问权限不正确时,编译器会报告错误。