Programação Orientada a Objetos - Herança e Encapsulamento
Autor: Guilherme Viterbo Galvão | Publicado: 2012-03-04T12:40:00-08:00



O conceito de Herança é o fator que deixa a programação orientada a objetos única.
O conceito é igual ao do mundo real, onde um ser vivo herda 
caracteríticas de seu descendente e possui as próprias. No mundo da 
programação o conceito é o mesmo, a herença lhe permite abstrair 
características comuns e centralizá - las em uma "superclasse", para que
 "subclasses" possam usá - las.
"Mas o que são superclasses e subclasses ?"
Simples, a "superclasse" nada mais é que uma classe que centraliza 
métodos e propriedades comuns a mais de uma classe, e a "subclasse" é a 
classe que herda de uma "superclasse" e assim possui características 
próprias mais a da "superclasse". Um bom exemplo está na sua casa, onde 
sua mãe ou pai são uma "superclasse" e você é uma "subclasse", ou seja 
você herdou características de seus pais e possui as próprias.

Vamos a um exemplo de UML:







Obs.: No programa de UML que fiz esse diagrama ele não mostra, sei la 
porque, as propriedades. Mas nesse exemplo só temos os Gets e Sets das 
propriedades.

Nesse exemplo ficou claro que Aluno herda de Pessoa, isso porque todo 
aluno, antes de mais nada, é uma pessoa. Esse é um exemplo bem simplório
 de abstração. Pense, se você tivesse as classes Cliente, Funcionário e 
Gerente, objviamente todos eles tem nome, idade, telefone, endereço, 
cpf, rg, data de nascimento e etc. Você iria replicar isso tudo nas três
 classes? Não, a programação orientada a objetos permite que você não 
gere redundância e assim deixe seu código mais otimizável. Você então 
irá criar uma classe Pessoa e as demais classes irão herdar seus 
atributos e métodos.
Vamos a um exemplo em código:



//Exemplo em C#

using System;

public class Pessoa
{
&nbsp;&nbsp;&nbsp; private String nome;

&nbsp;&nbsp;&nbsp; public String Nome
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return nome; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nome = value; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; private String rg;

&nbsp;&nbsp;&nbsp; public String Rg
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rg; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rg = value; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; private String cpf;

&nbsp;&nbsp;&nbsp; public String Cpf
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return cpf; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { cpf = value; }
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; private String endereco;

&nbsp;&nbsp;&nbsp; public String Endereco
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return endereco; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endereco = value; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; private int idade;

&nbsp;&nbsp;&nbsp; public int Idade
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return idade; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; idade = value; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; private String dataNascimento;

&nbsp;&nbsp;&nbsp; public String DataNascimento
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return dataNascimento; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataNascimento = value; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; }
}

//Exemplo em C#
using System;

public class Aluno : Pessoa{
&nbsp;&nbsp; private string ra;

&nbsp;&nbsp; public string Ra
&nbsp;&nbsp; {
&nbsp; &nbsp; &nbsp;&nbsp; get
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; return ra; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ra = value; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp; }
}



Bom, já que eu disse que quando herdamos de alguma classe, herdamos seus
 métodos e propriedades (no C# quando se quer fazer algum tipo de 
herença usa - se o ":" para representá - la) podemos fazer isso:



//classe Main
public static void main(String[] args){
&nbsp;&nbsp; Aluno aluno = new Aluno();
&nbsp;&nbsp; aluno.nome = "José";
&nbsp;&nbsp; //será que funciona?
}



Não, pois a propriedade "nome" está com o modificador de acesso 
"private". Isso significa dizer que aquele atributo só pode ser acessado
 pela classe Pessoa. "Aaaaaa, mas então é so eu colocar o public ao 
invés de private, certo?" Sim, mas isso é errado, afinal você fez o 
encapsulamento (Gets e Sets) atoa? Você estará ferindo o conceito de 
encapsulamento, usamos a palavra reservada "private" justamente para que
 isso não aconteça. O usuário da classe Pessoa, ou qualquer outra que a 
herde, não poderá ter acesso às suas propriedades. Para que o código acima funcione, nós devemos usar o acessor de propriedade Nome.

Exemplo:



//classe Main
public static void main(String[] args){
&nbsp;&nbsp; Aluno aluno = new Aluno();
&nbsp;&nbsp; aluno.Nome = "José";
&nbsp;&nbsp; //irá funcionar.
}



No C# nós não usamos os métodos para acessar as propriedades, até poderíamos criar métodos que retornassem o estado da propriedade, mas ao invés disso nós usamos os acessores de prorpiedade. Ele nada mais é do que um método que faz o GET e SET normal que conhecemos. Um exemplo da sua estrutura nós podemos ver na classe "Aluno":



&nbsp;&nbsp; //Classe Aluno 
&nbsp;&nbsp; private string ra;

&nbsp;&nbsp; public string Ra

&nbsp;&nbsp; {
&nbsp; &nbsp; &nbsp;&nbsp; get
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; return ra; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ra = value; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp; }



Quando queremos colocar um valor para "ra" basta apenas fazermos isso:



a.Ra = "R65326253g";


&nbsp;//quando fazermos isso o acessor da propriedade entende que estamos fazendo um set

E se precisarmos fazer um acesso à propriedade "ra" basta apenas fazer da seguitne forma:



a.Ra;


&nbsp;//quando fazermos isso o acessor da propriedade entende que estamos fazendo um get

No próximo post vou explicar sobre os Modificadores de Acesso.

Abraço!!!

 prettyPrint();