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:
Let Bindings
Example:
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”.