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 😆