📅  最后修改于: 2020-11-21 07:00:01             🧑  作者: Mango
类是表示可以具有属性,方法和事件的对象的类型。 “它们用于对应用程序中的动作,流程和任何概念实体建模”。
定义类类型的语法如下:
// Class definition:
type [access-modifier] type-name [type-params] [access-modifier] ( 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 ...
...
哪里,
类型名称是任何有效的标识符。默认的访问修饰符是public 。
类型参数描述了可选的通用类型参数。
参数列表描述了构造函数参数。主构造函数的默认访问修饰符是public 。
与optional as关键字一起使用的标识符为实例变量或自标识符命名,可以在类型定义中使用它来引用类型的实例。
继承关键字允许您指定类的基类。
let绑定使您可以声明类本地的字段或函数值。
do-bindings部分包含要在对象构造时执行的代码。
成员列表由其他构造函数,实例和静态方法声明,接口声明,抽象绑定以及属性和事件声明组成。
标记定义的开始和结束的关键字class和end是可选的。
构造函数是创建类类型实例的代码。
在F#中,构造函数的工作方式与其他.Net语言几乎没有什么不同。在类定义中,主要构造函数的参数描述为parameter-list。
构造函数的主体由let和do绑定组成。
您可以通过使用new关键字添加成员来添加其他构造函数-
new (argument-list) = constructor-body
以下示例说明了概念-
以下程序创建一个线类以及一个构造器,该构造器在创建类的对象时计算线的长度-
type Line = class
val X1 : float
val Y1 : float
val X2 : float
val Y2 : float
new (x1, y1, x2, y2) as this =
{ X1 = x1; Y1 = y1; X2 = x2; Y2 = y2;}
then
printfn " Creating Line: {(%g, %g), (%g, %g)}\nLength: %g"
this.X1 this.Y1 this.X2 this.Y2 this.Length
member x.Length =
let sqr x = x * x
sqrt(sqr(x.X1 - x.X2) + sqr(x.Y1 - x.Y2) )
end
let aLine = new Line(1.0, 1.0, 4.0, 5.0)
编译并执行程序时,将产生以下输出-
Creating Line: {(1, 1), (4, 5)}
Length: 5
使用类定义中的let绑定,可以为F#类定义私有字段和私有函数。
type Greetings(name) as gr =
let data = name
do
gr.PrintMessage()
member this.PrintMessage() =
printf "Hello %s\n" data
let gtr = new Greetings("Zara")
编译并执行程序时,将产生以下输出-
Hello Zara
请注意, Greetings类使用自标识符gr 。