1
resposta

Sobrescrever uma propriedade da Herança ou não ?

Olá , Boa noite

Estou com uma dúvida sobre código no vídeo :

class SaldoInsuficienteException(mensagem:String = "O saldo é Insuficiente") : Exception(mensagem)

Agora eu testei imaginando como o código fosse escrito em inglês e a variável ficasse igual a propriedade da própria Exception no caso "message", conseguiria sobrescrever (Override).

class SaldoInsuficienteException(override val  message :String = "O saldo é Insuficiente") : Exception()

Também funcionaria , mas não entendi o porque disso, e se contar pelo Override "val " que poderia ser " var " e mesmo assim funcionaria e poderia alterar a onde joga a Exception sendo val ou var . Porque isso ?

Espero que me ajudem por favor !

Atte ,

1 resposta

Opa Kainan, blz? Ao realizar a sobrescrita override, a implementação se torna da classe que está sobrescrevendo, portanto, você pode determinar se prefere uma implementação com val ou var. Um exemplo de código seria esse:

fun main() {
    val exception = ExceptionPersonalizada("mensagem de teste")
    println(exception.mensagem)
    exception.mensagem = "mensagem de teste editada"
    println(exception.mensagem)
}

open class MinhaException(
    open val mensagem: String = "mensagem padrão"
)

class ExceptionPersonalizada(
    override var mensagem: String
) : MinhaException()

Com esse exemplo, temos o seguinte resultado:

mensagem de teste
mensagem de teste editada

Observe que mesmo a MinhaException tendo uma propriedade val para mensagem, nada impede que a ExceptionPersonalizada consiga sobrescrever e torná-la editável com var, pois a implementação se torna exclusivamente da ExceptionPersonalizada, logo, durante uma sobrescrita, não temos mais acesso à implementação da classe super e podemos definir como será a implementação. Podemos até mesmo reutilizar o comportamento da classe mãe com alguma modificação:

class ExceptionPersonalizada(
    mensagem: String
) : MinhaException() {

    override var mensagem: String = mensagem
        get() {
            return "mensagem super: ${super.mensagem} + mensagem sobrescrita $field"
        }

}

Com o mesmo main temos o seguinte resultado:

mensagem super: mensagem padrão - mensagem sobrescrita: mensagem de teste
mensagem super: mensagem padrão - mensagem sobrescrita: mensagem de teste editada

Apenas para concluir, caso você queria modificar o valor da propriedade da classe super, você não vai conseguir, pois a implementação não foi afetada! Ainda é um val.

[]s