■ 最小的类
类是数据与函数的集合,是面向对象编程的一种基本的数据结构。
类的定义如下例所示。
-
类的定义
-
type 类名 [ 模式 ] [ as 识别符 ] =
class
继承声明
let式
[元素类型定义]*
end
class?end中的内容稍后再介绍,首先让我们来看最小的类。
type Minimum = class end;; |
这里是没有字段,没有成员函数,什么都没有的最小类的定义。但这样的类是什么用处也没有的,所以接下来让我们追加字段,介绍两种类的构造器的定义方法。
■ 显式的构造器
构造器是将类实例化,创建对象时为了进行初始化而调用的函数。在F#中,有两种构造器的书写方法,首先让我们举个例子。
type Explicit = class |
使用显式构造器的类声明在声明字段时使用val。另外,从new开始的这一行称为构造器。简略的书写方法如下例所示。
-
简略的构造器定义
-
new 模式 [as 识别符] = {[识别符=表达式 ;]*} [then 表达式]
上例中在模式中把data作为临时参数,在构造器中把data的值传给a。具体来说,通过new Explicit(10)来调用构造器并把10赋值给data,同时,通过这种方法把10赋值给a。另外,可以通过在对象名后加点,点后加字段名的方式访问用val声明的变量。
在构造器中更加稍微复杂一点的处理如下例所示。这段程序中,没有在创建对象后进行处理,而是在创建对象的同时进行了处理,得到的结果与上例相同。
type Explicit = class |
初始化结束后在then语句中继续执行在构造器内执行的初始化之外的处理。同时,如果想要引用构造器内自身的字段值,需要使用as关键字,后面跟类的别名,该别名代表类本身,访问类本身时使用该别名。在这个例子中用this来指定引用类本身,用this.a来访问类本身的字段a。
■ 隐式的构造器
针对利用类来说,还有一种使用隐式构造器的方法。这是显式构造器之后在F#中追加的功能。
使用隐式构造器时,在类名后接着指定模式。同时,用let来声明类内部使用的变量。
type Implicit(x:int) = class |
像这样用let定义的值,在类的外部是不能引用的。通过这种方式来使用类时,为了要引用到内部的值需要使用成员函数。或许,想要使用显式的字段声明时,需要使用类似DefaultValue的属性,同时还必须加上mutable。
type Implicit(x:int) = class |
这样声明字段相当于把字段用0或""进行初始化。这样,x的值就可以在类的外部被访问了。
最后,总结归纳成员的定义。
-
成员的定义
-
元素类型定义 :=
| 字段定义
| 成员定义
| 接口定义
字段定义 :=
| [static] [mutable] 识别符 : 类型名
成员定义 :=
| [ static ] member 成员绑定
| (override|default) 成员绑定
| 构造器定义
| abstract 签名定义
| val [mutable] 值、签名成员
构造器定义 :=
| new 模式 [as 识别符] = 构造器表达式
构造器表达式 :=
| ';'文字 构造器表达式
| 构造器表达式 then 表达式
| if 表达式 then 构造器表达式 else 构造器表达式
| let 变量声明 in 构造器表达式
| 对象的初始化表达式
对象的初始化表达式 :=
| '{' [ inherit 表达式; ] 字段绑定 '}'
| new 类型 表达式