Classes

Classes

Observação: O arquivo utilizado neste conteúdo que fala sobre classes é o 1-classes.kt.

Neste conteúdo vamos dar início ao aprendizado sobre orientação a objetos com o Kotlin, passando por classes também 🤗

Programação Orientada a Objetos

No mundo da programação, existe um modelo de programação em que usamos classes que possuem características que definem um objeto na vida real.

Onde cada uma dessas classes representam estruturas organizadas que facilitam tanto o desenvolvimento do código quanto a leitura e o entendimento por parte do desenvolvedor.

Até o momento atual, nós criamos nossos códigos com Kotlin de maneira procedural.

programação procedural divide o programa em pequenos programas e se refere a eles como funções.

É a mesma coisa que você criar um programa dividido por arquivos, onde existe um arquivo principal que chama as funções que estão dividas em cada um desses arquivos.

Já a a Programação Orientada a Objetos divide o programa em pequenas partes e se refere a elas como objetos.

É possível criar sistemas sem usar esse modelo de programação orientada a objetos? Sim, isso é totalmente possível!

Mas é claro, usando a orientação a objetos nossa vida como desenvolvedor será bastante facilitada.

O que são classes?

Como o próprio nome já nos diz, uma classe pode ser traduzida como um agrupamento de coisas, segundo o dicionário:

"cada um dos grupos ou divisões de uma série ou conjunto; categoria, seção, ordem."

Nesse caso, ela representa um grupo de comandos agrupados e organizados dentro de uma categoria principal, que é chamada de classe.

Por exemplo, no mundo real, nós temos o Reino Animal que é uma categoria que engloba os:

  • Poríferos,
  • Cnídarios,
  • Platelmitos,
  • Moluscos,
  • Cordados,
  • E muitos outros.

Cada qual contendo suas características únicas.

Fazendo uma alusão entre o mundo real e o mundo da programação, podemos dizer que o Reino Animal está para as classes em Kotlin.

Podemos dizer também, que as classes podem ser associadas a uma caixa de ferramentas, onde dentro desse caixa, nós podemos ter chave de fendacerrote, pregosparafusosfuradeiras e muitos outros equipamentos.

De modo que quando precisamos de uma furadeira, basta apenas abrir a caixa de ferramentas, sem a necessidade de tentar providenciar (ou criar) uma.

Trabalhando com Classes

Uma classe em Kotlin segue uma estrutura de bloco, e pode ser declarada desta forma:

//Exemplos de Declaração de Classes

class Produtos//Classe vazia, O kotlin permite isso!

class Pessoa{//Classe em Kotlin
//Classes sem a presença dos parêntesis, não possuem construtores, e você precisa declará-los!
}

class Produtos(){//Outra classe em Kotlin
//Essa classe possui parêntesis, isso significa que temos um construtor
}

Para chamar uma classe basta fazer sua instância da seguinte forma:

fun main() {
//Orientação a Objetos (Classes)

var produtos: Produtos = Produtos()//Instanciando uma classe dentro da variável produtos
var pessoa: Pessoa = Pessoa()//Instanciando uma classe dentro da variável pessoa

var produtoZero = Produtos()//Outra forma de instanciar a classe sem declarar o tipo
}

Perceba que no exemplo anterior, assim como qualquer outra variável que armazena um tipo de dados, nós podemos tanto declarar o tipo de dado (var produtos: Produtos = Produtos()), quanto somente fazer a atribuição direta (var produtoZero = Produtos()).

E com classes isso não é diferente.

Classes com Parâmetros (Atributos)

Uma classe em Kotlin pode receber parâmetros, do mesmo modo que fazemos com as funções.

No caso dessas classes, esses parâmetros assumem um outro nome, e são chamados de atributos da classe.

class Produto(val nome: String){//A classe Produto recebe um atributo chamado 'nome'

}

Para instanciar essa classe, precisamos passar o atributo para dentro da mesma, da seguinte forma:

var produto: Produto = Produto("TV OLED 52 POLEGADAS")

Podemos ter uma classe que recebe diversos atributos, basta apenas que você informe seu tipo e os separe por vírgula:

class Carro(val modelo: String, val ano: Int){

}

...

var meuCarro: Carro = Carro("BMW X9", 2023)

Podemos declarar atributos opcionais, para isso basta usar o operador de atribuição ainda na declaração desses atributos da seguinte forma:

class Carro(val modelo: String, val ano: Int = 2023){//Um Parâmetro Opcional

}

...

var meuCarro: Carro = Carro("BMW X9")//Não precisamos passar o 'ano', pois ele é opcional e assume o valor '2023'

Acessando Atributos de uma classe

Para acessar tais atributos, o processo é bem simples, basta pegar a instancia da classe e usar o ponto (.) para acessá-los.

class Carro(val modelo: String, val ano: Int){

}

...

var meuCarro: Carro = Carro("BMW X9", 2023)//Instanciando a classe Carro

println(meuCarro.modelo)//Maneiras de acessar os atributos da classe
println(meuCarro.ano)//Maneiras de acessar os atributos da classe

Também podemos salvar nossos atributos dentro de variáveis, observe:

var modeloCarro: String = meuCarro.modelo//Maneiro de salvar um atributo numa variável
var anoCarro: Int = meuCarro.ano//Maneiro de salvar um atributo numa variável

Declarando Atributos

Anteriormente nós vimos como declarar nossos atributos dentro dos parêntesis de uma classe (esses parêntesis são conhecidos como o método construtor de uma classe, ok?):

class Carro(val modelo: String, val ano: Int = 2023){

}

Mas também existe a possibilidade de declarar esses atributos de forma solta dentro dos blocos da classe, observe:

class Carro(val modelo: String, val ano: Int){

//Podemos também definir atributos como os abaixo:
var marca: String = ""
var opcionais: Boolean = true

}

Para acessá-los, o procedimento é mesmo que vimos anteriormente:

println(meuCarro.marca)//Chamando atributos que foram declarados de outra forma
println(meuCarro.opcionais)//Chamando atributos que foram declarados de outra forma

Modificando Atributos

Da mesma forma que podemos modificar o valor armazenado dentro das nossas variáveis, podemos também alterar o valor armazenado dentro dos atributos, para isso basta selecioná-lo e usar o operador de atribuição, como estamos fazendo abaixo:

meuCarro.marca = "Audi"//Alterando um atributo na classe
meuCarro.ano = 2024//Alterando um atributo na classe

Trabalhando com Métodos

Métodos nada mais são do que funções que podemos declarar dentro das classes.

class Carro(val modelo: String, val ano: Int){

//Abaixo podemos declarar nossos métodos

fun ligar(){//método da função
println("Ligando o Carro")
}

fun desligar(){//Método da função
println("Desligando o Carro")
}

}

Podemos chamá-los de maneira bem simples, vejamos:

meuCarro.ligar()//Chamando um método
meuCarro.desligar()//Chamando um método

Assim como acontece nas funções, métodos podem ter algum tipo de retorno:

class Carro(val modelo: String, val ano: Int){

fun retornarFrase(): String{//Método que retorna uma STRING
return "Este é um carro muito bonito!"
}

}

....

val frase = meuCarro.retornarFrase()//A string retornada será salva na variável chamada 'frase'

Também podemos enviar parâmetros a nossos métodos, da seguinte forma:

class Carro(val modelo: String, val ano: Int){

fun recebeParametro(a: Int){//Exemplo de método da classe que recebe atributo
println("O atributo é $a")
}

}

...

val retorno = meuCarro.recebeParametro(12)//Exemplo de envio de um atributo para um método

Chamando métodos junto a instância da classe

No Kotlin, conseguimos realizar o efeito cascata, de modo a instânciar uma classe e já executar um método, observe:

class Carro(val modelo: String, val ano: Int = 2023){

fun mostraInformacoes() {
println("As informações do carro são...")
}

}

...

//É possível instanciar uma classe e já executar um de seus métodos
var meuCarroDois = Carro("Fiat Uno 109").mostraInformacoes()

Acessando os atributos de uma classe por meio de métodos

Assim como em outras linguagens de programação, o Kotlin permite que acessemos nossos atributos por meio dos métodos existentes na própria classe.

class Carro(val modelo: String, val ano: Int = 2023){

var marca: String = ""
var opcionais: Boolean = true

fun removeOpcionais(){
this.opcionais = false//Usamos o this para fazer referência aos atributos da classe
}

fun mostraInformacoes() {
println(message = "Seu Carro é um ${this.modelo}, da marca ${this.marca} (ano: ${this.ano}). Possuí opcionais? ${this.opcionais}")
}

}

...

meuCarro.removeOpcionais()
var meuCarroDois = Carro("Fiat Uno 109").mostraInformacoes()

Conclusão

Neste conteúdo você aprendeu sobre orientação a objetos, e o uso das classes junto com seus atributos e métodos.

Até o próximo conteúdo 😄