{"id":184,"date":"2025-01-01T07:45:45","date_gmt":"2025-01-01T10:45:45","guid":{"rendered":"http:\/\/wagnersalvi.eti.br\/?p=184"},"modified":"2025-03-04T23:38:53","modified_gmt":"2025-03-05T02:38:53","slug":"heranca-em-programacao-orientada-a-objetos-exemplo-em-c","status":"publish","type":"post","link":"http:\/\/www.wagnersalvi.com.br\/?p=184","title":{"rendered":"Heran\u00e7a em Programa\u00e7\u00e3o Orientada a Objetos &#8211; Exemplo em C#"},"content":{"rendered":"\n<p>A Heran\u00e7a possibilita que as classes compartilhem seus atributos, m\u00e9todos e outros membros da classe entre si. Para a liga\u00e7\u00e3o entre as classes, a heran\u00e7a adota um relacionamento esquematizado hierarquicamente.<\/p>\n\n\n\n<p>Na Heran\u00e7a temos dois tipos principais de classe:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Classe Base<\/strong>: A classe que concede as caracter\u00edsticas a uma outra classe.<\/li>\n\n\n\n<li><strong>Classe Derivada<\/strong>: A classe que herda as caracter\u00edsticas da classe base.<\/li>\n<\/ul>\n\n\n\n<p>Com o uso da heran\u00e7a uma classe derivada geralmente \u00e9 uma implementa\u00e7\u00e3o especifica de um caso mais geral. A classe derivada deve apenas definir as caracter\u00edsticas que a tornam \u00fanica. Vamos tomar por base para exemplificar um banco de dados onde todas tabelas existem campos que s\u00e3o comuns a maioria das tabelas, como por exemplo Chave,, um campo de Ativo. Ent\u00e3o vamos criar uma classe abstrata como abaixo, onde temos alguns campos adicionais que s\u00e3o ideias de aplica\u00e7\u00e3o que ser\u00e3o explicadas abaixo:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public abstract class BaseModel:\n    {\n        public long Chave { get; set; }\n\n        public bool RegistroAtivo { get; set; } = true;\n\n        public string Cor { get; set; } = \"#000000\"; \/\/ preto\n\n        public bool Editavel { get; set; } = true;\n\n        public string? ChaveCriptografada\n        {\n            get\n            {\n                if (this.Chave.HasValue)\n                {\n                    CriptoService criptoService = new CriptoService();\n                    return criptoService.CriptografarQueryString(this.Chave.ToString());\n                }\n                else\n                {\n                    return null;\n                }\n            }\n        }\n    }<\/pre>\n\n\n\n<p>Criamos uma classe abstrata (classe que n\u00e3o pode ser instanciada para criar um objeto e sim usada para derivar outras classes n\u00e3o abstratas) . Na clase BaseModel acima definimos que o campo Chave,  RegistroAtivo que s\u00e3o os campos que exemplificamos. Al\u00e9m disso torna poss\u00edveis criar atributos que poder\u00e3o ser usados depois na programa\u00e7\u00e3o de forma mais simples, como por exemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Atributo Cor: esta sendo inicializado com o hexadecimal da cor preta, a ideia \u00e9 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\u00fado do registro do banco de dados , se for ativo = false deixar a linha vermelha (o que daremos exemplos em outros t\u00f3picos desta implementa\u00e7\u00e3o);<\/li>\n\n\n\n<li>Atributo Editavel: est\u00e1 sendo inicializado como true, mas na implementa\u00e7\u00e3o de uma classe Reserva por exemplo, caso a reserva esteja confirmada jogar neste atributo o valor como false. E dentro da aplica\u00e7\u00e3o tratar para que os campos fiquem read-only quando tiver este objeto\/registro com editavel = true (o que daremos exemplos em outros t\u00f3picos desta implementa\u00e7\u00e3o);<\/li>\n\n\n\n<li>Atributo ChaveCriptografada: Vamos imaginar que estamos usando numa p\u00e1gina web e o atributo \u00e9 passado por qualquer motivo na URL por exemplo temos uma p\u00e1gina que lista os registros e um bot\u00e3o Editar\/Excluir que ao clicar direcione para uma p\u00e1gina de edi\u00e7\u00e3o\/ Exclus\u00e3o. Neste caso, dependendo da forma que est\u00e1 sendo desenvolvido a URL pode ficar por exemplo assim \u201cHttp:\/\/paginaqualquer\/Reserva\/Editar?id=123 onde 123 seria a chave. N\u00e3o \u00e9 interessante mostrar a chave por motivo de seguran\u00e7a seria melhor passar de forma criptografada. Ent\u00e3o criamos uma forma seria usar este atributo ChaveCriptografada inv\u00e9s de Chave e estando na classe BaseModel, todas as classes que herdarem desta classe, j\u00e1 ter\u00e3o um atributo de Chave criptografada para ser usada de forma simples e num ponto \u00fanico, simplificando bastante o desenvolvimento.<\/li>\n<\/ul>\n\n\n\n<p>Acima s\u00e3o alguns exemplos mas pode ter centenas de utilidade que pode ser usada conforme a necessidade do projeto.<\/p>\n\n\n\n<p>Agora vamos para a classe Derivada e vamos usar como exemplo uma classe Reserva que seria reserva de um Hotel que tem al\u00e9m dos campos da classe base, os campos data inicio e fim da reserva, hospede, status ,ent\u00e3o a classe ficaria por exemplo desta forma:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ReservaModel : BaseModel\n    {\n        public HospedeModel Hospede { get; set; } = new HospedeModel();\n\n        public DateTime InicioReserva { get; set; }\n\n        public DateTime FimReserva { get; set; }\n\n        public string Status { get; set; }\n    }<\/pre>\n\n\n\n<p>Veja que temos a express\u00e3o na declara\u00e7\u00e3o da ReservaModel a express\u00e3o \u201c: BaseModel\u201d que \u00e9 a forma em C# de citar que esta classe tem deriva\u00e7\u00e3o da classe BaseModel, o que faz com que a classe ReservaModel al\u00e9m dos atributos criados nela pr\u00f3pria tenha os atributos da classe BaseModel.<\/p>\n\n\n\n<p>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\u00e7os, etc. Vamos Imaginar a classe HospedeModel bem simplificada da seguinte forma:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"> public class HospedeModel : BaseModel\n    {\n        public string Nome { get; set; }\n\n        public string CPF { get; set; }\n\n        public string Endereco { get; set; }\n    }<\/pre>\n\n\n\n<p>Ao usamos dentro do Visual Studio a Classe Reserva podemos usar da seguinte forma (n\u00e3o iremos tratar neste post a conex\u00e3o com banco de dados ou busca de dados e sim somente uso do Objeto :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var consulta = from Reserva in dtb_Reservas.AsEnumerable() select reserva;\nIEnumerable reservas = consulta.Where(c => c.Field&lt;string>(\"CHAVE\").Equals(1));\n\/\/ traz o registro de Chave 1 do banco de dados da tabela Reservas\n\nReservaModel reservaModel = new ReservaModel();\n\nforeach (DataRow reserva in reservas )\n{\n   reservaModel.Chave = reserva.Field&lt;long>(\"Chave\");\n   reservaModel.Hospede.Chave = reserva.Field&lt;long>(\"CHAVE_CLIENTE\");\n   reservaModel.Hospede.Nome= reserva.Field&lt;long>(\"NOME_CLIENTE\");\n   ... outros campos de hospedes\n   ... outros campos de reserva\n   reservaModel.RegistroAtivo = reserva.Field&lt;bool>(\"ATIVO\");\n   reservaModel.Status = reserva.Field&lt;string>(\"STATUS\");\n   if (reservaModel.Status == \"CANCELADO\")\n   {\n     reservaModel.Cor := #ff0000; \/\/ vermelho\n   }\n}<\/pre>\n\n\n\n<p>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\u00edvel no objeto reservaModel de forma simples e vamos falar de alguns pontos interessantes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>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 \u201cget\u201d ele pega o atributo Chave e retorna ela j\u00e1 criptografada<\/li>\n\n\n\n<li>Vemos que criamos a l\u00f3gica de que sempre que o atributo Status estiver como CANCELADO, j\u00e1 joga a cor do atributo Cor como vermelho o que j\u00e1 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\u00e7\u00e3o ficar fazendo esta l\u00f3gica. J\u00e1 estando encapsulado num local s\u00f3. Como por exemplo uma tabela HTML abaixo onde o Usuario Teste est\u00e1 inativo<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"567\" height=\"140\" src=\"http:\/\/wagnersalvi.eti.br\/wp-content\/uploads\/2025\/01\/exemploAtivo.png\" alt=\"\" class=\"wp-image-185\" srcset=\"http:\/\/www.wagnersalvi.com.br\/wp-content\/uploads\/2025\/01\/exemploAtivo.png 567w, http:\/\/www.wagnersalvi.com.br\/wp-content\/uploads\/2025\/01\/exemploAtivo-300x74.png 300w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/><\/figure>\n\n\n\n<p>O Codigo do HTML ficou bem simplificado como abaixo:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@foreach (var item in @Model.ListaGrid)\n{\n\n\u00a0\u00a0\u00a0\u00a0 &lt;tr>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;td class=\"registro_left\" style=\"color:@item.Cor; width:25%\">@item.Nome.ToString()&lt;\/td>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;td class=\"registro_left\" style=\"color:@item.Cor; width:25%\">@item.Email.ToString()&lt;\/td>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ... \/\/ outros campos\n\n\u00a0\u00a0\u00a0\u00a0 &lt;\/tr>\n\n}<\/pre>\n\n\n\n<p>\u00c8 poss\u00edvel ver que o estilo do HTML esta mudando a cor conforme o atributo Cor no c\u00f3digo \u201d style=\u201dcolor:<strong>@item.Cor<\/strong>\u201d \u201c<\/p>\n\n\n\n<p>Se por acaso quiser que tenha um status PENDENTE e que fique em laranja, basta ir no m\u00e9todo que faz a busca do bando de dados e colocar esta condi\u00e7\u00e3o. Esta altera\u00e7\u00e3o ir\u00e1 refletir em todo o projeto de forma simples e de f\u00e1cil manuten\u00e7\u00e3o.<\/p>\n<p>Views: 0<\/p>","protected":false},"excerpt":{"rendered":"<p>A Heran\u00e7a possibilita que as classes compartilhem seus atributos, m\u00e9todos e outros membros da classe entre si. Para a liga\u00e7\u00e3o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":385,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[49],"tags":[62,64,63],"class_list":["post-184","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacao","tag-c","tag-heranca","tag-orientacao-objetos"],"_links":{"self":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts\/184","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=184"}],"version-history":[{"count":0,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts\/184\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/media\/385"}],"wp:attachment":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=184"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}