Sobes.tech
Junior

Explique como funciona a palavra-chave 'super' na linguagem Kotlin.

sobes.tech IA

Resposta da IA

A palavra-chave super é usada para aceder aos membros (propriedades, métodos) da classe pai a partir da classe filha.

As principais formas de uso:

  1. Chamada ao construtor da classe pai: Frequentemente usado no construtor da classe filha para chamar o construtor correspondente do pai. Isto é obrigatório se a classe pai tiver um construtor primário com parâmetros.

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // O construtor de Child chama o construtor de Parent,
        // passando o parâmetro name.
    }
    
  2. Acesso aos membros da classe pai, sobrescritos na filha: Permite aceder à implementação de um método ou propriedade na classe pai, mesmo que tenham sido sobrescritos (com override) na filha.

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Chamada a greet() de Base
            println("Hello from Derived")
        }
    
        override val value: Int = 2
            get() {
                println("Acedendo ao valor de Derived")
                return super.value + 1 // Acesso a value de Base
            }
    }
    
  3. Acesso aos membros de um tipo superior específico (em caso de herança múltipla de interfaces): Se uma classe implementa várias interfaces que têm membros com nomes iguais, super junto com a especificação do nome da interface entre colchetes angulares (super<TypeName>) permite indicar de forma inequívoca a qual membro de qual interface se refere.

    interface MyInterface1 {
        fun foo() { println("MyInterface1 foo") }
    }
    
    interface MyInterface2 {
        fun foo() { println("MyInterface2 foo") }
    }
    
    class MyClass : MyInterface1, MyInterface2 {
        override fun foo() {
            super<MyInterface1>.foo() // Chamada a foo() de MyInterface1
            super<MyInterface2>.foo() // Chamada a foo() de MyInterface2
        }
    }