Herança

Herança

Observação: O arquivo utilizado neste conteúdo que fala sobre heranças é o 9-heranca.kt.

Pronto para mais um conteúdo?

Conceito de Heranças

Como o próprio nome já nos diz, uma herança é o montante de bens e valores deixados por um indivíduo para outro.

E no mundo das classes isso não é diferente... 

Imagine uma classe PAI que possui alguns atributos e métodos definidos, e uma classe filho que possui seus próprios atributos e métodos, maaaas que herda os atributos e métodos da classe pai.

Herda de uma maneira que o filho consegue usar os atributos e métodos que foram declarados na classe pai, incrível não?

Pense na retrocompatibilidade do Playstation 2 que além de rodar jogos do playstation 2, consegue também rodar jogos do Playstation 1.

Ou quem sabe você pode pensar também naqueles drivers antigos de leitor/gravador de DVD numa época em que a mídia DVD era novidade, lembra que a maioria deles não só conseguia ler e gravar DVD como CD tambem?

Herança em classes no Kotlin é isso!

Heranças no Kotlin

Na linguagem Kotlin, para que uma classe esteja habilitada para ser herdada, a mesma precisa estar declarada como 'open' que significado 'aberto'.

Isso significa que ela poderá ter seus métodos e atributos públicos herdados por outras classes:

open class Pai(){//A classe precisa estar aberta 'open', para dizer que ela pode ser herdada

//Todos os atributos aqui declarados serão herdados por uma classe do tipo FILHO

var corOlhos: String = "Azuis"
var corPele: String = "Branca"

//Todos os métodos aqui declarados serão herdados por uma classe do tipo FILHO

fun sobrenomeDaFamilia(){
println("...Van Der Line")
}

}

Para que uma classe FILHO possa HERDAR os métodos e atributos da classe PAI, precisamos a seguinte declaração abaixo:

class Filho(): Pai(){//A classe filho herda todos os atributos e métodos da classe pai

}

Com isso, todos os métodos pertencentes a classe PAI, estarão disponíveis para uso, quando instanciarmos a classe FILHO, observe:

var filhote: Filho = Filho()

//Observe que estamos utilizando métodos e atributos que não foram definidos dentro de filho

filhote.sobrenomeDaFamilia()
println("Cor do Olhos: ${filhote.corOlhos}")
println("Cor da Pele: ${filhote.corPele}")

Além é claro, a classe filho pode dispor de seus próprios métodos e atributos, e usa-los quando for necessário:

class Filho(): Pai(){//A classe filho herda todos os atributos e métodos da classe pai
var lancheiraCheia: Boolean = true
fun irAEscola(){
println("Indo a escola...")
}
}

...

var filhote: Filho = Filho()

/Além é claro, de ter seus proprios métodos
filhote.irAEscola()
println("Lancheira Cheia? ${filhote.lancheiraCheia}")

Obviamente que esses métodos e atributos (irAEscola() e lancheiraCheia) só existirão na classe filho e não na classe pai, ok?

É importante ressaltar que no Kotlin não existe herança múltipla! As classes só herdam de uma única classe PAI e não de múltiplas classes PAI.

Mas isso pode ser resolvido facilmente com Interfaces, conteúdo que veremos nos próximos conteúdos.

É importante ressaltar que apesar do Kotlin não aceitar heranças múltiplas, é possível criar uma classe NETO que vai herdar da classe FILHO que por sua vez vai herdar da classe PAI. (Mas esse tipo de coisa deve ter evitada, e tratada com Interfaces).

Evite Repetições de Código

Quando você se deparar com códigos como o de baixo:

class Computador(var marca: String){
fun ligar(){}
fun desligar(){}
}

class Eletronico(var marca: String){
fun ligar(){}
fun desligar(){}
}

Ascenda um sinal de alerta na sua mente!

Pois códigos como esses devem ser evitados.

O primeiro problema é que se você precisar mudar uma das lógicas, a alteração será feita em 2 lugares diferentes.

E segundo... duplicar código é problema, e significa escrita em dobro!

Conclusão

Neste conteúdo você aprendeu o conceito de heranças em Kotlin, e como fazer com que uma classe FILHO herde atributos e métodos de uma classe PAI.

Até o próximo conteúdo 😆