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