Construindo Aplicações C# – Aplicação de Herança em um objeto

Sharing is caring!

A Herança possibilita que as classes compartilhem seus atributos, métodos e outros membros da classe entre si. Para a ligação entre as classes, a herança adota um relacionamento esquematizado hierarquicamente.

Na Herança temos dois tipos principais de classe:

  • Classe Base: A classe que concede as características a uma outra classe.
  • Classe Derivada: A classe que herda as características da classe base.

Com o uso da herança uma classe derivada geralmente é uma implementação especifica de um caso mais geral. A classe derivada deve apenas definir as características que a tornam única.

Vamos tomar por base para exemplificar um banco de dados onde todas tabelas existem campos que são comuns a maioria das tabelas, como por exemplo Chave, Usuario e data que fez ultima alteração , um campo de Ativo. Então vamos criar uma classe abstrata como abaixo, onde temos alguns campos adicionais que são idéias de aplicação que serão explicadas abaixo:

public abstract class BaseModel:
    {
        public long Chave { get; set; }

        public string? UsuarioUltimaAlteracao { get; set; }

        public DateTime? DataUltimaAlteracao{ get; set; }

        public bool RegistroAtivo { get; set; } = true;

        public string Cor { get; set; } = "#000000"; // preto

        public bool Editavel { get; set; } = true;

        public string? ChaveCriptografada
        {
            get
            {
                if (this.Chave.HasValue)
                {
                    CriptoService criptoService = new CriptoService();
                    return criptoService.CriptografarQueryString(this.Chave.ToString());
                }
                else
                {
                    return null;
                }
            }
        }
    }

Criamos uma classe abstrata (classe que não pode ser instanciada para criar um objeto e sim usada para derivar outras classes não abstratas) . Na clase BaseModel acima definimos que o campo Chave, UsuarioUltimaAlteracao , DataUltimaAlteracao, RegistroAtivo que são os campos que exemplificamos. Além disso torna possiveis criar atributos que poderão ser usados depois na programação de forma mais simples, como por exemplo:

  • Atributo Cor: esta sendo inicializado com o hexadecimal da cor preta, a ideia é ser usado por exemplo num grid/tabela numa pagina Web para determinar a cor daquela linha. Exemplo quando o atributo Ativo for false deixar uma linha em vermelho, ao buscar do banco de dados e criar o Objeto com conteúdo do registro do banco de dados , se for ativo = false deixar a linha vermelha (o que daremos exemplos em outros tópicos desta implementação);
  • Atributo Editavel: está sendo inicializado como true, mas na implementação de uma classe Reserva por exemplo, caso a reserva esteja confirmada jogar neste atributo o valor como false. E dentro da aplicação tratar para que os campos fiquem read-only quando tiver este objeto/registro com editavel = true (o que daremos exemplos em outros tópicos desta implementação);
  • Atributo ChaveCriptografada: Vamos imaginar que estamos usando numa página web e o atributo é passado por qualquer motivo na URL por exemplo temos uma página que lista os registros e um botão Editar/Excluir que ao clicar direcione para uma página de edição/ Exclusão. Neste caso, dependendo da forma que está sendo desenvolvido a URL pode ficar por exemplo assim “Http://paginaqualquer/Reserva/Editar?id=123 onde 123 seria a chave. Não é interessante mostrar a chave por motivo de segurança seria melhor passar de forma criptografada. Então criamos uma forma seria usar este atributo ChaveCriptografada invés de Chave e estando na classe BaseModel, todas as classes que herdarem desta classe, já terão um atributo de Chave criptografada para ser usada de forma simples e num ponto único, simplificando bastante o desenvolvimento.

Acima são alguns exemplos mas pode ter centenas de utilidade que pode ser usada conforme a necessidade do projeto.

Agora vamos para a classe Derivada e vamos usar como exemplo uma classe Reserva que seria reserva de um Hotel que tem além dos campos da classe base, os campos data inicio e fim da reserva, hospede, status ,então a classe ficaria por exemplo desta forma:

    public class ReservaModel : BaseModel
    {
        public HospedeModel Hospede { get; set; } = new HospedeModel();

        public DateTime InicioReserva { get; set; }

        public DateTime FimReserva { get; set; }

        public string Status { get; set; }
    }

Veja que temos a expressão na declaração da ReservaModel a expressão “: BaseModel” que é a forma em C# de citar que esta classe tem derivação da classe BaseModel, o que faz com que a classe ReservaModel além dos atributos criados nela própria tenha os atributos da classe BaseModel.

Ainda podemos ver que existe um atributo chamado Hospede do Tipo HospedeModel, isso faz com que dentro do objeto Reserva se tenha um atributo com todos os atributos de um hospede, como Nome, documentos, endereços, etc. Vamos Imaginar a classe HospedeModel bem simplificada da seguinte forma:

    public class HospedeModel : BaseModel
    {
        public string Nome { get; set; }

        public string CPF { get; set; }

        public string Endereco { get; set; }
    }

Ao usamos dentro do Visual Studio a Classe Reserva podemos usar da seguinte forma (não iremos tratar neste post a conexão com banco de dados ou busca de dados e sim somente uso do Objeto :

var consulta = from Reserva in dtb_Reservas.AsEnumerable() select reserva;
IEnumerable reservas = consulta.Where(c => c.Field<string>("CHAVE").Equals(1));
// traz o registro de Chave 1 do banco de dados da tabela Reservas

ReservaModel reservaModel = new ReservaModel();

foreach (DataRow reserva in reservas )
{
   reservaModel.Chave = reserva.Field<long>("Chave");
   reservaModel.Hospede.Chave = reserva.Field<long>("CHAVE_CLIENTE");
   reservaModel.Hospede.Nome= reserva.Field<long>("NOME_CLIENTE");
   ... outros campos de hospedes
   ... outros campos de reserva
   reservaModel.RegistroAtivo = reserva.Field<bool>("ATIVO");
   reservaModel.Status = reserva.Field<string>("STATUS");
   if (reservaModel.Status == "CANCELADO")
   {
     reservaModel.Cor := #ff0000; // vermelho
   }
}

Acima podemos ver que ao instanciar o objeto reservaModel ja temos os campos tanto da classe base como da classe derivada e tambem da classe Hospede de forma acessível no objeto reservaModel de forma simples e vamos falar de alguns pontos interessantes:

  • Ao colocarmos valor no Atributo Chave que vem da classe BaseModel, ja podemos se quiser pegar o valor do atributo reservaModel.ChaveCriptogradada pois conforme a classe base ao se fazer o “get” ele pega o atributo Chave e retorna ela já criptografada
  • Vemos que criamos a lógica de que sempre que o atributo Status estiver como CANCELADO, já joga a cor do atributo Cor como vermelho o que já pode ser usado para um grid ou tabela HTML ficar em vermelho o fundo ou fonte de acordo com necessidade, sempre precisar na camada de apresentação ficar fazendo esta lógica. Já estando encapsulado num local só. Como por exemplo uma tabela HTML abaixo onde o Usuario Teste está inativo

O Codigo do HTML ficou bem simplificado como abaixo:

@foreach (var item in @Model.ListaGrid)
{
     <tr>
	<td class="registro_left" style="color:@item.Cor; width:25%">@item.Nome.ToString()</td>
	<td class="registro_left" style="color:@item.Cor; width:25%">@item.Email.ToString()</td>
        ... // outros campos
     </tr>
}

È possível ver que o estilo do HTML esta mudando a cor conforme o atributo Cor no código ” style=”color:@item.Cor” “

Se por acaso quiser que tenha um status PENDENTE e que fique em laranja, basta ir no método que faz a busca do bando de dados e colocar esta condição. Esta alteração irá refletir em todo o projeto de forma simples e de fácil manutenção.

Nos próximos posts teremos mais dicas para construir uma aplicação C#

Wagner Salvi

Trabalho há mais de 20 anos com Desenvolvimento de Sistemas, incluindo ERP’s (Enterprise Resource Planning). Atualmente atuo como Gerente de Produtos coordenando a equipe de desenvolvimento em implementações de novas funcionalidades e tecnologias. Neste momento estudando sobre novas tecnologias iOT usando RaspBerry, desenvolvimento para plataformas móveis, como Android.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.