1
resposta

Herança com repetição

Olá. Tenho a seguinte situação: criei uma classe Cliente

public class Cliente:Endereco
    {
        public int Codigo { get; set; }
        public string Nome { get; set; }
        public string Cpf { get; set; }
        public Endereco EnderecoEntrega { get; set; }
        public Endereco EnderecoCobranca { get; set; }

        public Cliente(int codigo, string nome, string cpf, int tipoEndereco): base(tipoEndereco)
        {
            Codigo = codigo;
            Nome = nome;
            Cpf = cpf;
            TipoEndereco = tipoEndereco;
        }



    }

que herda a classe Endereço

public abstract class Endereco
    {
        public int TipoEndereco { get; set; } //1 onde reside - 2 cobranca - 3 entrega
        public string EnderecoCli { get; set; }
        public string Numero { get; set; }
        public string Complemento { get; set; }
        public string Bairro { get; set; }
        public string Cidade { get; set; }
        public string Estado { get; set; }
        public string Pais { get; set; }

        public Endereco (int tipoEndereco)
        {
            TipoEndereco = tipoEndereco;
        }
    }

A minha questão é a seguinte:

O endereço tipo 1, será informado na herança. Os endereços tipo 2 (de cobranca) e o tipo 3 (de entrega) serão propriedades informadas quando criada um novo cliente. Porém, eu quero que os endereços tipo 2 e 3 sejam implementados todas as vezes que eu instanciar o cliente. Como que eu faço para garantir isso?

1 resposta

Bom dia, André. Tudo bom?

Se Cliente deriva de Endereco, então o código a seguir está correto:

Endereco endereco = new Cliente( ... );

Mas, será que faz sentido o Cliente ser filho de Endereco?

Uma alternativa é remover a herança e receber o endereço de residência no construtor:

public class Cliente
{
    public int Codigo { get; set; }
    public string Nome { get; set; }
    public string Cpf { get; set; }
    public Endereco EnderecoResidencia { get; set; }
    public Endereco EnderecoEntrega { get; set; }
    public Endereco EnderecoCobranca { get; set; }

    public Cliente(int codigo, string nome, string cpf, Endereco residencia):
    {
        Codigo = codigo;
        Nome = nome;
        Cpf = cpf;
        EnderecoResidencia = residencia;
    }
}

E agora, sobre a propriedade TipoEndereco, por que este tipo é importante? Os nomes das propriedades EnderecoResidencia, EnderecoEntrega e EnderecoCobranca já deixam bastante evidente o tipo de cada Endereço. Além disso, o que acontece se você quiser usar o tipo Endereco em outra classe com o nome EnderecoTrabalho? Seria necessário considerar mais um tipo nesta propriedade.

Então, o que eu faria, seria remover a propriedade TipoEndereco.

O que você acha? Ajudei com sua dúvida?

Abs.