Classes
优质
小牛编辑
130浏览
2023-12-01
类是表示可以具有属性,方法和事件的对象的类型。 “它们用于模拟应用程序中的操作,流程和任何概念实体”。
语法 (Syntax)
定义类类型的语法如下 -
// 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 ...
...
Where,
type-name是任何有效的标识符。 默认访问修饰符是public 。
type-params描述了可选的泛型类型参数。
parameter-list描述了构造函数参数。 主构造函数的默认访问修饰符是public 。
与可选的as关键字一起使用的identifier as实例变量或self-identifier,提供了名称self-identifier,可以在类型定义中使用该名称来引用该类型的实例。
inherit关键字允许您指定类的基类。
let绑定允许您声明类的本地字段或函数值。
do-bindings部分包括在对象构造时要执行的代码。
member-list包含其他构造函数,实例和静态方法声明,接口声明,抽象绑定以及属性和事件声明。
标记定义的开头和结尾的关键字class和end是可选的。
一个类的构造函数
构造函数是用于创建类类型实例的代码。
在F#中,构造函数与其他.Net语言的工作方式差别不大。 在类定义中,主构造函数的参数被描述为parameter-list。
构造函数的主体由let和do绑定组成。
您可以使用new关键字添加其他构造函数来添加成员 -
new (argument-list) = constructor-body
以下示例说明了这一概念 -
例子 (Example)
以下程序创建一个行类以及一个构造函数,该构造函数在创建类的对象时计算行的长度 -
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类使用self-identifier gr 。