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.