Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Dúvida no Ex. 6 da Aula 4 - Herança

Quando eu faço a herança da classe Conta, para a classe conta Poupanca, tenho um problema com o construtor.

Pois eu queria que tanto conta quanto conta poupança fossem criadas obrigatoriamente já passando o número e o cliente. Isso funcionou até eu criar a contaPoupanca filha da classe conta.

Eu refiz o construtor da classe contaPoupanca, só que, na própria classe contaPoupanca, o visualStudio avisa que a classe pai, Conta precisa ter um construtor com 0 argumentos. =/

Então se faço a classe pai ter essa opção a aplicação funciona. Mas, o objetivo é: Tanto pai quanto filho serem construindo obrigatoriamente com estes dois ítens. Como faço??

Seguem as classes:

class Conta
    {
        public int Numero { get; set; }

        public double Saldo { get; protected set; }
        public Cliente Titular { get; set;} 

        public Conta(int numero, Cliente titular)
        {
            this.Numero = numero;
            this.Titular = titular;
        }

        public virtual void Saca(double valor)
        {
            this.Saldo -= valor;
        }

        public void Deposita(double valor)
        {
            this.Saldo += valor;
        }

        public void Transfere(double valor, Conta destino)
        {
            this.Saldo -= valor;
            destino.Saldo += valor;
        }
    }
class ContaPoupanca :Conta
    {

        public ContaPoupanca(int numero, Cliente titular)
        {
            this.Numero = numero;
            this.Titular = titular;
        }       

        public override void Saca(double valor)
        {
           this.Saldo -= (valor + 0.1);
        }                   
    }
6 respostas

Como eu consigo fazer isso, sem que precise tornar opcional a construção? Quebrei a cabeça aqui e não consegui solucionar...

Ainda não consegui solucionar...

Olá Renan, tudo bem?

Mesmo quando você cria uma classe que herda de outra no C#, o construtor da classe pai precisa ser chamado de alguma forma. O que acontece no seu caso é o seguinte: você tem a classe Conta e criou um construtor customizado para ela, certo?

Aí você foi lá e fez a mesma coisa na classe filha, já que construtores no C# não são herdados. Até aí, ok.

O problema é que implicitamente o seu construtor da classe filha está chamando o construtor sem argumentos da classe pai. O que ele está fazendo é isso, mais ou menos:

public ContaPoupanca(int numero, Cliente titular) : base ()
 {
         this.Numero = numero;
         this.Titular = titular;
}

Tá vendo esse base na frente do construtor? Ele faz isso implicitamente, é uma chamada para o construtor sem argumentos da classe pai. Só que como você criou um construtor customizado na classe pai, esse construtor padrão não existe mais lá.

Pra resolver o problema, crie um construtor sem argumentos na classe Conta:

class Conta
{

    public int Numero { get; set; }

    public double Saldo { get; protected set; }
    public Cliente Titular { get; set; }

     public Conta()
     {

     }
    //restante da classe
}

Dê uma lida nesse artigo meu http://gabsferreira.com/construtores-sao-herdados-no-csharp/

Sim, isso foi feito, porém, as classes filhas e pai passam a ter a permissão de serem criadas sem os argumentos que eu queria deixar obrigatório na criação. Como por exemplo: Cliente ("Nome do Titular", "nº_do_CPF"); Fazendo isso, os construtores passam a permitir clientes sem nome, contas sem número e etc. No momento da criação, tem como deixar as classes pai e filhas, com construtores customizados, obrigando a passar alguns argumentos no momento da criação?

solução!

Nesse caso, você tem que criar o construtor na classe base e obrigatoriamente criar o mesmo construtor na classe filha. Mas, na classe filha você tem que chamar o construtor da classe base.

A classe Conta ficaria assim:

class Conta
{

    public int Numero { get; set; }
    public double Saldo { get; protected set; }
    public Cliente Titular { get; set; }

    public Conta(int numero, Cliente titular)
    {
        this.Numero = numero;
        this.Titular = titular;
    }
    //restante da classe
}

E a ContaPoupanca:

class ContaPoupanca : Conta
{
    public ContaPoupanca(int numero, Cliente titular) : base(numero, titular)
    {

    }
    //restante da classe
}