F # - Aulas

Classes são tipos que representam objetos que podem ter propriedades, métodos e eventos. 'Eles são usados ​​para modelar ações, processos e quaisquer entidades conceituais em aplicativos'.

Sintaxe

A sintaxe para definir um tipo de classe é a seguinte -

// 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 ...
...

Onde,

  • o type-nameé qualquer identificador válido. O modificador de acesso padrão para isso épublic.

  • o type-params descreve parâmetros opcionais de tipo genérico.

  • o parameter-listdescreve os parâmetros do construtor. O modificador de acesso padrão para o construtor primário épublic.

  • o identifier usado com o opcional as palavra-chave dá um nome para a variável de instância, ou self-identifier, que pode ser usado na definição de tipo para se referir à instância do tipo.

  • o inherit palavra-chave permite que você especifique a classe base para uma classe.

  • o let as ligações permitem que você declare campos ou valores de função locais para a classe.

  • o do-bindings seção inclui o código a ser executado na construção do objeto.

  • o member-list consiste em construtores adicionais, declarações de instância e métodos estáticos, declarações de interface, ligações abstratas e declarações de propriedade e evento.

  • As palavras-chave class e end que marcam o início e o fim da definição são opcionais.

Construtor de uma classe

O construtor é o código que cria uma instância do tipo de classe.

Em F #, os construtores funcionam de maneira um pouco diferente de outras linguagens .Net. Na definição da classe, os argumentos do construtor primário são descritos como lista de parâmetros.

O corpo do construtor consiste no let e do ligações.

Você pode adicionar construtores adicionais usando a nova palavra-chave para adicionar um membro -

new (argument-list) = constructor-body

O exemplo a seguir ilustra o conceito -

Exemplo

O programa a seguir cria uma classe de linha junto com um construtor que calcula o comprimento da linha enquanto um objeto da classe é criado -

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)

Quando você compila e executa o programa, ele produz a seguinte saída -

Creating Line: {(1, 1), (4, 5)}
Length: 5

Let Bindings

As ligações let em uma definição de classe permitem que você defina campos privados e funções privadas para classes 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")

Quando você compila e executa o programa, ele produz a seguinte saída -

Hello Zara

Observe o uso de auto-identificador gr para a classe Saudações .