📜  F#-类

📅  最后修改于: 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部分包含要在对象构造时执行的代码。

  • 成员列表由其他构造函数,实例和静态方法声明,接口声明,抽象绑定以及属性和事件声明组成。

  • 标记定义的开始和结束的关键字classend是可选的。

类的构造函数

构造函数是创建类类型实例的代码。

在F#中,构造函数的工作方式与其他.Net语言几乎没有什么不同。在类定义中,主要构造函数的参数描述为parameter-list。

构造函数的主体由letdo绑定组成。

您可以通过使用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