1
resposta

[Dúvida] Problema com Transferência

Terminei o curso "Go: Orientação a Objetos", porém nas aulas o professor passava todas funções usava por um momento e as deixava de canto, eu fui adaptando para tentar fazer um sistema que rode no terminal com switch, for, scan e etc.

O programa estava funcionando completamente certo até que o professor separou as contas em dois tipos, conta corrente e conta poupança. Considerando que as 2 conta tem exatamente os mesmos campos, como eu posso fazer para permitir uma transferência entre as duas contas?

Inicialização das contas em formato de variáveis

conta1 := contas.ContaCorrente{Titular: clientes.Titular{
        Nome:      "Guilherme",
        CPF:       "546.241.138-37",
        Profissao: "Front-End Developer"},
        NumeroAgencia: 123, NumeroDaConta: 123456}

    conta2 := contas.ContaPoupanca{Titular: clientes.Titular{
        Nome:      "André",
        CPF:       "243.277.777-81",
        Profissao: "Software Engineer"},
        NumeroAgencia: 132, NumeroDaConta: 654321}

Case que cuida da transferência

case 3:
                var transferencia float64
                fmt.Println("Digite o valor da transferência:")
                _, err := fmt.Scan(&transferencia)

                if err != nil {
                    fmt.Println("Erro com a transferência:", err)
                }

                conta2.Transfere(transferencia, &conta1)
                fmt.Println(conta1)
                fmt.Println(conta2)

Função transfere dentro de contaPoupanca e contaCorrente

func (conta *ContaPoupanca) Transfere(transferencia float64, contaDestino *ContaCorrente) bool {

    if conta.saldo > transferencia && transferencia > 0 {
        conta.saldo -= transferencia
        contaDestino.Depositar(transferencia)
        return true
    } else {
        fmt.Println("Saldo insuficiente!")
        return false
    }
}
func (conta *ContaCorrente) Transfere(transferencia float64, contaDestino *ContaCorrente) bool {

    if conta.saldo > transferencia && transferencia > 0 {
        conta.saldo -= transferencia
        contaDestino.Depositar(transferencia)
        return true
    } else {
        fmt.Println("Saldo insuficiente!")
        return false
    }
}

Link para repositório do Github: https://github.com/GuilhermeMViana/Banco-OOP

1 resposta

Olá, Guilherme! Vejo que você está fazendo um ótimo trabalho com o Go e a orientação a objetos. Sua dúvida é muito pertinente e acredito que posso te ajudar.

No seu caso, você está tentando fazer uma transferência entre dois tipos diferentes de contas, ContaCorrente e ContaPoupanca. No entanto, suas funções Transfere em ambas as estruturas só permitem transferências para contas do mesmo tipo. Isso é um problema, porque você quer permitir transferências entre diferentes tipos de contas.

Uma maneira de resolver isso seria definir uma interface Conta que ambas as estruturas implementem. Essa interface poderia incluir todos os métodos que uma conta precisa ter, como Depositar, Sacar e Transfere. Aqui está um exemplo de como poderia ser essa interface:

type Conta interface {
    Depositar(valor float64) bool
    Sacar(valor float64) bool
    Transfere(valor float64, contaDestino Conta) bool
}

Agora, você pode alterar suas funções Transfere para aceitar um parâmetro do tipo Conta em vez de ContaCorrente ou ContaPoupanca. Isso permitirá que você transfira dinheiro entre diferentes tipos de contas. Aqui está um exemplo de como você pode alterar a função Transfere:

func (conta *ContaCorrente) Transfere(valor float64, contaDestino Conta) bool {
    if conta.saldo > valor && valor > 0 {
        conta.saldo -= valor
        contaDestino.Depositar(valor)
        return true
    } else {
        fmt.Println("Saldo insuficiente!")
        return false
    }
}

Note que agora contaDestino é do tipo Conta, que pode ser qualquer estrutura que implemente a interface Conta, incluindo ContaCorrente e ContaPoupanca.

Espero que isso resolva seu problema! Lembre-se, este é apenas um exemplo e pode ser necessário fazer algumas alterações para se adequar ao seu código específico. Espero ter ajudado e bons estudos!