Neste artigo veremos os principais conceitos e alguns exemplos de Herança.
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.
O fato de as classes derivadas herdarem atributos das classes bases assegura que programas orientados a objetos cresçam de forma linear e não geometricamente em complexidade. Cada nova classe derivada não possui interações imprevisíveis em relação ao restante do código do sistema.
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.
Por exemplo: uma classe base que serviria como um modelo genérico pode ser a classe Pessoa com os campos Nome e Idade. Já uma classe derivada poderia ser Funcionário com os campos Nome e Idade herdados da classe Pessoa, acrescido do campo Cargo.
De maneira natural, as pessoas visualizam o mundo sendo formado de objetos relacionados entre si hierarquicamente.
Mais um exemplo: vamos analisar a relação entre animais, mamíferos e cachorros. Os animais, sob uma descrição abstrata, apresentam atributos, tais como tamanho, inteligência e estrutura óssea. Apresentam também aspectos comportamentais como mover-se, dormir, comer, respirar, etc. Esses atributos e aspectos comportamentais definem a classe dos animais.
Analisando os mamíferos, que são filhos da classe animais, veremos atributos detalhados e específicos a ele, como por exemplo, tipo de dente, pelos e glândulas mamárias.
Assim, podemos afirmar que os mamíferos são classificados como uma classe derivada dos animais, que por sua vez, são uma classe base dos mamíferos.
Pela chamada hierárquica de classes, a classe derivada mamíferos recebe todos os atributos de animais, partindo do princípio que uma classe derivada recebe por herança todos os atributos de seus ancestrais.
Exemplo Prático
Crie um projeto do tipo Console Application, dando a ele o nome de ExemploHeranca e dê OK. Crie também uma classe dando a ela o nome Animal, esta classe será a classe pai ou classe base.
Nesta classe, adicione o seguinte código:
public class Animal
{
public string Nome;
public string Tipo;
public int Idade;
public string CorDoPelo;
}
Assim temos quatro campos que definem os atributos da classe Animal.
Consideremos a criação de um cadastro de cachorros do reino Animal. Entendemos que cada Cachorro é um Animal, mais nem todo Animal é um Cachorro. Essa relação nos obriga a criar uma extensão da classe Animal a fim de que a mesma contenha os dados específicos referentes aos cachorros. Assim, a extensão criada acaba herdando os membros existentes na definição da classe Animal.
Nesta classe, adicione o seguinte código:
public class Cachorro : Animal
{
public string Raca;
}
Note que usamos os dois pontos : em nossa classe. Fazendo assim, informamos à classe que ela herda as características da classe Animal.
Assim temos a definição da classe Cachorro, que, pela herança, recebe as características da classe Animal, somadas à definição de seus próprios membros, no caso ao campo Raca.
Perceba que, se formos ao Program.cs e instanciarmos a classe Cachorro, temos também acesso aos campos da classe Animal:
Isso também se deve ao fato que foram declarados campos do tipo public, que nos dá acesso a eles de outra classe usando a herança, como neste caso.
Operador Base – Por meio deste operador temos acesso à classe pai. Assim, qualquer referencia feita com o uso do operador base, dentro de uma classe filha, será apontada diretamente para a classe pai.
Apesar de não recomendado, podemos manter atributos de nomes iguais nas classes pai e filha. Este procedimento é chamado de hiding. Quando o usamos, devemos adicionar a instrução new na frente do atributo da classe derivada, caso contrário o compilador irá enviar um alerta sobre o uso de hiding.
Para este exemplo crie duas novas classes, a base, que será chamada de Pai, e a derivada, que será chamada de Filha. Na classe Pai adicione os seguintes campos:
public class Pai
{
public string Nome = "Arnaldo";
public int Idade = 35;
}
Na Filha, adicione os campos com o mesmo nome mais com valores diferentes (note o uso da instrução new) e crie o método que irá exibir os valores de ambas as classes em tela:
public class Filha : Pai
{
public new string Nome = "Jaqueline";
public new int Idade = 10;
public void MostrarValores()
{
Console.WriteLine("Nome Filha: " + Nome);
Console.WriteLine("Nome Pai: " + base.Nome);
Console.WriteLine("Idade Filha: " + Idade);
Console.WriteLine("Idade Pai: " + base.Idade);
}
}
Agora no Program.cs, instancie a classe Filha e chame o método recém-criado:
Filha objFilha = new Filha();
objFilha.MostrarValores();
Console.ReadKey();
Compile a aplicação e veja o resultado: