0
respostas

utilizando companion object

Olá, tentei reimplementar a atividade dessa lição (03 Utilizando o polimorfismo) utilizando algo como as variáveis static do C++. A ideia seria não implementar a classe calculadora tendo apenas uma variável estática acumulando as bonificações na classe funcionário e acumular os valores utilizando o bloco init. Para fazer isso acabei descobrindo os companion objects que tem comportamento semelhante ao static.

open class Funcionario(
    val nome: String,
    val cpf: String,
    val salario: Double
) {
    companion object {
        var totalBonificacao: Double = 0.0
    }

    init {
        println("bonificação do funcionario ${this.bonificacao}")
        totalBonificacao += this.bonificacao
    }
    open val bonificacao: Double get() {
        return salario * 0.1
    }

    open fun print() {
        println("nome $nome")
        println("cpf $cpf")
        println("salario $salario")
        println("bonificacao $bonificacao")
    }
}

assim no main eu poderia apenas chamar Funcionario.totalBonificacao e ter o total de bonificações

   val calculadora = CalculadoraBonificacao()

    calculadora.registra(alex)
    calculadora.registra(otavio)
    calculadora.registra(victoria)

    println("total de bonificação ${calculadora.total}")

    println("total de bonificacoes utilizando companion object: ${Funcionario.totalBonificacao}")

Porem o resultado acabou não saindo correto:

Bem vindo ao Bytebank
bonificação do funcionario 100.0
bonificação do funcionario 2200.0
bonificação do funcionario 4400.0
nome Alex
cpf 111.111.111-11
salario 1000.0
bonificacao 100.0

nome Otavio
cpf 222.222.222-22
salario 2000.0
bonificacao 2200.0

nome Victoria
cpf 333.333.333-33
salario 4000.0
bonificacao 4600.0

total de bonificação 6900.0
total de bonificacoes utilizando companion object: 6700.0

Process finished with exit code 

os prints do bloco init aparecem logo no começo, como esperado porem é possível notar que o terceiro valor (Diretor) retorna incorretamente: 4400.00 ao invés de 4600.00, logo falta a plr de 200. Imagino que o motivo seja o companion object estar declarado na classe Funcionário então não tem acesso ao membro plr de Diretor.

Minhas questões são:

1- Por que a bonificação de Diretor foi calculada utilizando o get do Gerente?

2- Por que o Gerente conseguiu utilizar seu método get para bonificação quando o companion object está definido na classe Funcionário?

3- Porque não ocorreu um erro durante a execução se o companion object não conseguiu acessar o plr do Diretor?

obs: ainda vou tentar replicar o código no C++ e testar seu comportamento mas imagino que sera semelhante ou gerará um erro durante a execução.