F#的class赋予了F#面向对象的编程能力,也是F#连接.net中其它面向对象语言的桥梁。其基本形式如下:
// Class definition:
type [access-modifier] type-name [type-params]( parameter-list ) [ as identifier ] =
[ class ]
[ inherit base-type-name(base-constructor-args) ]
[ let-bindings ]
[ do-bindings ]
member-list
...
[ end ]
// Mutually recursive class definitions:
type [access-modifier] type-name1 ...
and [access-modifier] type-name2 ...
...
构造函数
首先我们来通过一个简单的示例来介绍F#中的构造函数:
type Point(x:int,y:int) =
new() = Point(0,0)
new(x:int) = Point(x,0)
它的类型为:
type Point =
class
new : unit -> Point
new : x:int -> Point
new : x:int * y:int –> Point
end
从中可以看出,这三行分别定义了三个构造函数,首先第一行type Point(x:int,y:int)定义了一个初始的构造函数,它是所有其它构造函数的入口。
第二行new()和第三行new(x:int)分别基于初始构造函数定义了两个新的构造函数,这个Point类的等效C#代码为:
public class Point
{
public Point() : this(0, 0) { }
public Point(int x) : this(x, 0) { }
public Point(int x, int y) { }
}
初始化:
进入构造函数后,我们第一步要做的是初始化,初始化工作一般是通过do绑定来完成的,我们把上面那个Point类改造一下,在构造函数中加入一个打印x和y值的功能:
type Point(x:int,y:int) =
do
printfn "(%d,%d)" x y
new() = Point(0,0)
new(x:int) = Point(x,0)
do绑定可以看做是在初始构造函数的函数体,也就是说,其它所有的构造函数都会执行do绑定的表达式。
另外,如果要实现更复杂的初始化操作,还牵涉到了let绑定,关于let绑定和do绑定更多信息,在后续介绍F#对象中的成员时再做进一步介绍。
基类
在F#中,通过关键字inherit指明了对象的基类,这一点其实和C#很相似,只是语法结构不一样,这里只举一个简单的例子,后续介绍F#对象的继承时再做详细介绍。
type MyClassBase1() =
let mutable z = 0
abstract member function1 : int –> int
default u.function1(a : int) = z <- z + a; z
type MyClassDerived1() =
inherit MyClassBase1()
override u.function1(a: int) = a + 1
自标示符(Self Identifiers)
在C#和C++中,可以通过this关键字引用当前对象实例的成员;但在F#中,这种标示自己的标示符并不是特定的,可以通过as来生命为任意一个名称,示例如下:
type MyClass2(data_in) as self =
let data = data_in
do
self.PrintMessage()
member this.PrintMessage() =
printf "Creating MyClass2 with Data %d" data
成员
F#对象的成员非常丰富,总体来说大致有如下几种:
- let绑定
- do绑定
- 成员变量
- 属性
- 索引
- 方法
- 运算符重载
- 事件