Dominar as aulas de F#

As classes F# permitem que você aproveite os benefícios dos paradigmas funcional e OOP em seu código. Neste artigo, vamos nos aprofundar nas classes F# e explorar seus recursos exclusivos, sintaxe e práticas recomendadas para ajudá-lo a dominar a arte da POO em F#.

Embora a linguagem F# seja conhecida por sua sintaxe concisa e expressiva quando se trata de programação funcional, ela também oferece suporte a conceitos de classe e objeto comumente encontrados na programação orientada a objetos (OOP).



Aulas F#

O termo classe refere-se a um tipo que representa um objeto que possui propriedades, métodos e eventos. Em um aplicativo, esses modelos podem ser usados ​​para representar ações, processos e entidades conceituais.

As classes F# fornecem uma maneira de definir objetos com estado e comportamento mutáveis.

Uma classe em F# é um esquema para criar objetos que encapsulam dados e métodos.

Segue os mesmos princípios básicos da POO, incluindo encapsulamento, herança e polimorfismo. No entanto, ao contrário de algumas outras linguagens orientadas a objetos, as classes em F# são imutáveis ​​por padrão, o que significa que suas propriedades não podem ser alteradas depois de definidas.


Definindo Classes F#

No F#, você pode definir uma classe usando a palavra-chave type, seguida pelo nome da classe, parâmetros de tipo opcionais e um conjunto de membros de classe, como propriedades, métodos e eventos.

Sintaxe

Um tipo de classe é definido usando a seguinte sintaxe:

// 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 nome do tipo da classe pode ser qualquer identificador válido. Um modificador de acesso público é o padrão para esse tipo de acesso.
  • Os parâmetros de tipo são um conjunto de parâmetros de tipo genéricos opcionais que podem ser usados.
  • A lista de parâmetros descreve os parâmetros que são usados ​​no construtor. O construtor primário tem um modificador de acesso público como padrão.
  • O identificador é usado como parte da palavra-chave opcional as para fornecer um nome explícito à variável de instância ou autoidentificador, que é usado para ser referido como uma instância do tipo na definição do tipo.
  • A palavra-chave herdada é usada para especificar a classe base de uma classe que você está criando.
  • As associações let tornam possível declarar campos e valores de função que são locais para a classe para uso no código.
  • A seção do-bindings contém o código que será executado quando o objeto for construído.
  • A lista de membros na classe inclui construtores, métodos de instância, métodos estáticos, declarações de interface, associações abstratas, propriedades e declarações de eventos, além dos construtores.
  • As palavras-chave class e end são palavras-chave opcionais que especificam o início e o fim da definição, respectivamente.

Construtor de uma classe

A criação de uma instância de um tipo de classe é a função conhecida como construtor.

Há uma pequena diferença em como os construtores funcionam em F# em comparação com outras linguagens .Net .

As definições de classe descrevem os argumentos dos construtores primários como listas de parâmetros.

Let e ​​do são usados ​​como o corpo do construtor.

Adicionar mais construtores à sua classe é tão simples quanto adicionar um membro usando a palavra-chave new:

new (argument-list) = constructor-body

Um exemplo simples de como esse conceito pode ser ilustrado é o seguinte:

Este programa cria um objeto da classe line junto com um construtor que calcula o comprimento da linha durante a criação de um objeto da classe:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
type Line = class
val A1 : float
val B1 : float
val A2 : float
val B2 : float
new (a1, b1, a2, b2) as this =
{ A1 = a1; B1 = b1; A2 = a2; B2 = b2;}
then
printfn " Creating Line: {(%g, %g), (%g, %g)} \nLength: %g" this.A1 this.B1 this.A2 this.B2 this.Length
member a.Length =
let sqr a = a * a
sqrt(sqr(a.A1a.A2) + sqr(a.B1a.B2) )
end
let line = new Line(7.0, 8.0, 5.0, 7.0)
And the output will be:
Creating Line: {(7, 8), (5, 7)}
Length: 2.23607
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Let Bindings

Para classes F#, as associações let permitem que você defina funções e campos privados definindo as associações let em uma definição de classe.

Example: 

1
2
3
4
5
6
7
8
9
10
type Greetings(name) as greet =
let user = name
do
greet.MessagePrinting()
member this.MessagePrinting() =
printf "Hello %s " user
let g = new Greetings("Jeff Bezos")
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

E a saída será a seguinte:

Hello Jeff Bezos

Exemplo de Explicação

Neste exemplo, definimos uma classe chamada “ Greetings ” com um único construtor que recebe um parâmetro “ name “. Usamos a sintaxe “ as greet ” para criar um alias para a instância da classe que será criada.

Dentro do construtor, atribuímos o valor “ name ” a um campo mutável “ user ” na classe. Então, temos um bloco “ do ”, que é executado automaticamente logo após a criação do objeto.

Dentro do bloco “ do ”, chamamos o método “ MessagePrinting ” no objeto “ greet ”, que é o alias que criamos para a instância da classe “Greetings”.

O método “ MessagePrinting ” é um membro da classe e usa a função “ printf ” da biblioteca padrão F# para imprimir uma string formatada. A string “ Hello %s ” é a string de formato, onde “ %s ” é um espaço reservado para o valor do campo “ user ” na classe.

Por fim, criamos uma nova instância da classe “Greetings” com o nome “ Jeff Bezos ” e atribuímos a ela uma variável “g”. Isso acionará o construtor da classe “Greetings”, que imprimirá a mensagem “Hello Jeff Bezos” usando o método “MessagePrinting” dentro do bloco “do”.

Nós valorizamos o seu feedback.
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0

Assine a nossa newsletter
Digite seu e-mail para receber um resumo semanal de nossos melhores posts. Saber mais!
ícone