Show/Hide Toolbars

XSharp

用途

向编译器声明一个类名。

语法

 [Attributes] [Modifiers] CLASS <idClass> [INHERIT <idClass>]
 [IMPLEMENTS <idInterface>[, <IdInterface2>,..]

 [ClassMembers]

 END CLASS

参数

Attributes一个可选的特性列表,用于描述实体的元信息,例如在 MsTest 类库中包含测试的方法/函数上的 [TestMethod] 属性。请注意,当特性写在关键字上方的行时,特性必须在同一行或以分号结尾。

 

Modifiers一个可选的修饰符列表,用于指定实体的可见性或范围,例如:PUBLIC, PROTECTED, HIDDEN, INTERNAL, SEALED, ABSTRACT 或 STATIC.

 

 

<idClass>类的有效标识符名称。 类是一个实体,因此与其他实体共享相同的命名空间。 这就意味着不可能出现类和全局变量同名的情况。

 

INHERIT <idClass>现有类(称为超类)的名称,新类从该类继承方法和实例变量(HIDDEN 例外)。

 

IMPLEMENTS <idInterface>该类实现的接口名称

 

ClassMembers这可以是任何实例变量: ACCESS, ASSIGN, CONSTRUCTOR, DESTRUCTOR, EVENT, METHOD, OPERATOR, PROPERTY

描述

在向编译器声明类名后,类名后面会跟 0 个或多个实例变量声明语句。 使用类名声明变量(参见本指南中的 GLOBAL 和 LOCAL 语句)的目的是保存特定类的实例、实例化类的实例、定义方法(参见本指南中的 METHOD 语句)和类的子类。

备注

绑定实例变量:  实例变量既可以提前绑定,也可以延迟绑定,这取决于你如何声明和使用它们。

 

如果在编译时已知变量的内存位置,就会发生早期绑定。 编译器清楚地知道如何引用变量,因此可以生成相应的代码。

 

如果在编译时不知道变量的内存位置,就需要进行后期绑定。 编译器无法从程序源代码中确定变量的确切位置,也无法确定如何引用该变量,因此编译器会生成代码,在表中查找符号。 查找在运行时进行。

 

由于早期绑定的实例变量不需要运行时查找,因此使用它们来代替后期绑定的变量将大大提高应用程序的性能。 下表总结了四类实例变量的绑定和可见性问题:

 

变量类型绑定                                可见性        
EXPORT如果可能,尽早绑定        全应用程序 CLASS 和全模块 STATIC CLASS        
INSTANCE永远是后期绑定                在类和子类中        
HIDDEN永远是前期绑定                仅在类中        
PROTECT永远是前期绑定                在类和子类中

 

对象实例化:  声明类后,使用类名和实例操作符 {} 创建类的实例。 语法如下

<idClass>{[<uArgList>]}

其中 <uArgList> 是以逗号分隔的可选值列表,这些值作为参数传递给一个名为 Init() 的特殊方法(有关 Init() 方法的更多信息,请参阅本指南中的 METHOD 语句)。

 

访问实例变量:从外部(即从非其类方法的任何实体)访问导出实例变量的语法如下:

<idObject>:<idVar>

只有在可以看到非导出实例变量的方法中,才能访问这些变量。 在一个方法中,可以使用以下语法访问所有实例变量:

[SELF:]<idVar>

SELF: 前缀是可选的,除非是 ACCESS/ASSIGN 方法(更多信息请参阅本指南中的 ACCESS 和 ASSIGN 语句,以及 METHOD 语句中有关 SELF 的更多信息)。

实例变量与其他程序变量一样。 您可以在语言中允许使用表达式的任何地方访问它们。

 

XSharp 不再支持 [STATIC] 前缀

示例

下面的示例定义了两个类,其中一个继承了另一个的值,并演示了如何创建一个带有实例变量初始值的类实例:

FUNCTION Start()
 LOCAL oCust AS Customer
 oCust := Customer{"Louis", 92.07.22, "GA", 987}
 oCust:DisplayAll()
 ? oCust:Name
 ...
 
// 声明 Person 类
 
CLASS Person
 EXPORT Name AS STRING
 INSTANCE Birth AS DATE
 
// 声明继承自 Person 类的子类 Customer
 
CLASS Customer INHERIT Person
 PROTECT CustNum AS SHORTINT
 INSTANCE Address AS STRING
 
// 声明初始化实例变量的方法
// 请注意,cName 和 dBirth 可用于
// Customer 类,即使它们没有声明
// 作为类的一部分 - 它们继承自 Person
 
METHOD Init(cOne, dTwo, cThree, nFour) ;
         CLASS Customer
 Name := cOne
 Birth := dTwo
 Address := cThree
 CustNum := nFour
 RETURN SELF
 
// 声明方法以显示所有实例变量
 
METHOD DisplayAll() CLASS Customer
 ? "Name:     ", Name
 ? "Birth Date:  ", Birth
 ? "Address:   ", Address
 ? "Number:    ", CustNum

参见

ACCESS, ASSIGN, CONSTRUCTOR, DESTRUCTOR, EVENT, METHOD, OPERATOR, PROPERTY