CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA
A OBJETOS COM C#
Quando aprendemos programação, na maioria das vezes é de
maneira estruturada, ou seja, efetuar a leitura de um código de
“cima para baixo”, começando no topo, executando cada linha na
sequência de maneira estruturada e lógica. Claro que não há nada
de errado nisso, de fato é assim que se aprende lógica de progra-
mação, tão fundamental para quem está iniciando no mundo da
programação. Pensar estruturado, com lógica é fundamental, é o
começo de tudo e nos ajuda em muitas decisões na vida, estar dian-
te de um código é um problema a ser solucionado ou codificado.
Mas entendemos que este modelo de programação, ainda pre-
sente em muitas linguagens não é aplicado em C#. De fato, nunca
foi, C# nasceu em 1999 (data em que foi lançado oficialmente no
Brasil) orientado a Objetos. Entender o básico da orientação a obje-
tos lhe ajudará a tirar o máximo de proveito da linguagem C#, reu-
tilizar código, criar suas próprias bibliotecas de comando, proteger
acessos indevidos a funções e comandos que são apenas internos,
evitando assim, erros e bugs desnecessários. Além de tudo, como já
dizia Stroustrup (O criador da linguagem de programação C++, que
é o C orientado a objetos) “OOP deixa seu código organizado, com
acessos bem definidos e além de tudo elegante”. Por que não ter um
código elegante e organizado? Conseguimos isso com a orientação
a objetos, e isto vai além do que elegância e organização, trata-se
de qualidade de confiabilidade de código.
C# PARA INICIANTES
LÓGICA DA ORIENTAÇÃO A OBJETOS
A Orientação a objetos possui alguns pilares importantes e es-
senciais de serem entendidos antes de começar a codificar. Uma
rápida pesquisa na internet encontrará centenas de artigos, alguns
com os 5 pilares do OOP, outros com os 12 Pilares o OOP, mas nes-
te livro não vamos numerar os pilares, e sim discorrer agora sobre
alguns conceitos importantes em programação orientada a objetos
que devemos saber antes de codificar.
PRÓXIMO AO MUNDO REAL
A Orientação a Objetos (e por isso leva o nome de “Objetos”)
tenta aproximar a programação ao que vemos no mundo real. Tra-
tando partes do código como se fossem objetos (fisicamente reais)
e com suas características e propriedades, com isso conseguimos
abordar um problema a ser solucionado em pequenas partes de
código, que juntas solucionam o problema inteiro. Veja na figura a
seguir o entendimento desta abordagem, comparando com a pro-
gramação estruturada.
Figura 20 – OOP
Observe que a abordagem do problema a ser solucionado é di-
ferente na orientação a objetos. Procuramos quebrar o problema
em diversos “objetos” e cada objeto possui uma caraterística, um
nome, uma funcionalidade e uma propriedade. Neste conceito va-
98
CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA A OBJETOS COM C#
mos entender um dos principais pilares da Orientação a objetos, a
Abstração.
ABSTRAÇÃO
O conceito da abstração é tornar aquele código autossuficiente
de maneira que possa ser chamado por outras partes do seu pro-
grama, sem que você necessite entender como ele foi implemen-
tado para que assim possa chamá-lo. Usamos isso em nossa vida,
por isso a programação a objetos é uma maneira de aproximar a
programação ao mundo real. Geralmente consumimos produtos
e serviços que não sabemos exatamente como eles foram feitos,
apenas utilizamos. A Abstração na orientação a objetos tem este
objetivo, tornar parte de um código complexo abstraído de toda
uma regra de negócio, por exemplo, e assim ser chamado quando
houver necessidade diversas vezes ao longo do seu programa.
ENCAPSULAMENTO
Este é o que consideramos ser outro pilar da programação
orientada a objetos. Encapsulamento é a forma de “esconder” ao
mundo uma parte do código que não faz necessário todo o pro-
grama conhecer. No gráfico da figura anterior, observe que temos
Método 1 e Método 2 em cada um dos objetos criados para so-
lucionar o problema. Mas os problemas não precisam enxergar a
implementação um do outro, apenas saber que existem comandos
(ou métodos) chamado “Método 1” e “Método 2” que irão resolver
o problema proposto, sem que haja necessidade de dar acesso a
todo o código implementado. Com isso, protegemos parte do códi-
go que está dentro dos métodos, contra acesso indevido. Uma vez
que um código (ou objeto) é encapsulado, seus detalhes não são
mais visíveis ou acessíveis ao restante do programa, apenas aquela
parte do programa autorizada à visibilidade. Aqui entram os modifi-
cadores chamados “Public”, “Private”, “Protected” que mais adiante
trataremos no código C#.
99
C# PARA INICIANTES
HERANÇA
Outro pilar importante na orientação a objetos. Lembre-se do
que comentamos, que a OOP tenta aproximar a codificação ao
mundo real. Herança no mundo real é a passagem de bens (ativos
ou não) para outra pessoa, geralmente dentro de uma linhagem
hierárquica da mesma família. Uma vez que a pessoa recebeu a
herança, por exemplo, uma casa ou um carro, ela pode escolher
modificá-lo, mudando a cor, aumentando os cômodos. No entanto,
o ponto de partida é um Ativo que ela já recebeu e assim realiza
duas modificações necessárias. Na Orientação a objetos é a mesma
coisa.
A herança é hierarquicamente baseada, pode ser modificada
após herdada. Uma classe pode ser herdada, ou seja, ela recebe
tudo o que é possível de aquele código anterior, possibilitando que
ela modifique ou adicione o que for necessário para dar continui-
dade aquela classe (objeto código) que foi herdado. Pode parecer
confuso no início, mas vamos ver isso em C#, e ao ver o código em
C# vale apena voltar e ler este parágrafo.
Veja um exemplo de herança, vamos codificar um sistema que
irá catalogar animais. Temos um “objeto” ou classe chamado de
“Animais”, o qual possui características globais de todos os animais,
por exemplo, idade, peso, altura, raça, cor, etc. Se desejamos re-
finar um pouco mais o código, a fim de controlar os animais ma-
míferos, por exemplo, herdar a classe “Animais” e nela adicionar
a característica “Glândulas de Mama”, que só estão presentes nos
animais mamíferos. Sem a necessidade de repetir novamente to-
das as características como idade, peso, altura, etc.
POLIMORFISMO
Outro poderoso pilar da orientação a objetos. O Polimorfismo
permite que os objetos (ou classes) possuam o mesmo nome de
método, a mesma implementação, para facilitar a leitura do código
e até mesmo porque às vezes a regra de negócio aplicada traz esta
100
CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA A OBJETOS COM C#
necessidade de ter o mesmo nome de “Método” em classes herda-
das. Possuem a mesma assinatura de comando ou de método, mas
a implementação ou resultado é diferente. Já falamos de herança,
então vamos aproveitar para explicar polimorfismo com herança.
Vamos ao exemplo clássico ensinado nas universidades sobre
Polimorfismo. O Homem e os animais mamíferos. Imagine o de-
senvolvimento de um sistema relacionado a este tema, a melhor
prática seria a seguinte:
Classe (ou Objeto) Mamífero – Nesta classe mamífero há uma
função ou método chamado Locomocao( ). Obviamente não sabe-
mos e não conhecemos esta locomoção porque ela é específica de
cada animal. Com isso começamos a usar herança, o qual imple-
menta o método “Locomocao ( )”, conforme a necessidade.
Sendo assim Classe (ou Objeto) Macaco herdado da classe Ma-
mífero que possui sua função “Locomocao ( )” implementado com o
resultado de “de galho em galho”.
Classe (ou Objeto) Homem herdado da classe Mamífero que
possui sua função “Locomocao ( )” implementado com o resultado
de “Caminhando”.
Classe (ou Objeto) Canguru herdado da classe Mamífero que
possui sua função “Locomocao ( )” implementado com o resultado
de “Saltando”.
Exemplo do código:
classe Mamifero
Locomocao() // ainda a ser codificado na herança
Mamifero ObjetoMamifero;
ObjetoMamifero = new Macaco();
101
C# PARA INICIANTES
ObjetoMamifero.Locomocao(); // de galho em galho
ObjetoMamifero = new Homem();
ObjetoMamifero.Locomocao(); // Caminhando
ObjetoMamifero = new Canguru();
ObjetoMamifero.Locomocao(); // Saltando
Sem dúvida nos exercícios que vamos propor para entender
orientação a objetos em C# será mais claro o conceito de polimor-
fismo, não se preocupe em entender 100% o conceito nestes pará-
grafos.
ENTENDENDO AS CLASSES (OBJETOS)
Vamos entender sobre classes criando a primeira classe no C#
para mostrar um texto digitado pelo usuário. Vamos fazer primeiro
de maneira estruturada e depois vamos abstrair os comandos den-
tro de uma classe, chamando-a desde o programa principal. Certi-
fique-se que o VS Code está instalado, configurado, compilando e
executando código em C#. Se isso ainda não foi feito, leia o capítulo
sobre a instalação.
Abra o VS Code, crie duas pastas CAP5\OlaMundo e o arquivo
Program.cs digite:
using System;
namespace MinhaPrimeiraClasse
{
class ProgramaPrincipal
{
static void Main(string[] args)
{
102
CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA A OBJETOS COM C#
//Declaramos uma variavel do tipo string (texto)
String Digitado = new String(“”);
//Solicitamos que o usuario digite alguma
coisa e
//armazene na variavel criada
Digitado = Console.ReadLine();
//Mostramos o que foi digitado
Console.WriteLine(Digitado);
}
}
Agora vamos transformar este código em uma classe, de manei-
ra que ela possa ser chamada em outras partes do código sem que
sejam necessárias todas as vezes chamar as funções do System.
WriteLine e System.ReadLine. Sendo assim, comente o bloco inter-
no do static void Main e substitua pelo código a seguir. Mas, primei-
ro crie a classe InteracaoUsuario para não apresentar erro. Neste
código, abstraímos os comandos WriteLine e ReadLine, os quais são
invocados na classe ProgramaPrincipal. Código muito simples, mas
que já permite entender que a qualquer momento do código, pode-
mos esta classe InteracaoUsuario.
using System;
namespace MinhaPrimeiraClasse
{
class Pr ogramaPrincipal
{
static void Main(string[] args)
{
//Criamos o objeto Pedido herdado da clase
InteracaoUsuario
InteracaoUsuario Pedido = new InteracaoUsu
ario();
//Invocamos os metodos do objeto Pedido
herdado da classe mãe InteracaoUsuario
103
C# PARA INICIANTES
var Digitado = Pedido.SolicitarDigitacao();
Pedido.MostrarDigitacao( Digitado);
}
}
//Criamos a Classe InteracaoUsuario com dois
metodos principais
//Método que solicita a digitaç ão de algo no
terminal
//Método que mostra o que foi digitado
class InteracaoUsuario
{
public string SolicitarDigitacao()
{
return Console.ReadLine();
}
public void MostrarDigitacao( string Digitado)
{
Console.WriteLine(Digitado);
}
}
}
Aqui aproveitamos um conceito interessante em programação:
sempre há como fazer diferente e melhor. Tenho certeza que um pro-
gramador experiente já olhou para este código e percebeu melho-
rias, as quais podem ser feitas e implementadas a qualquer momen-
to. Vamos aproveitar e ver algumas variações de implementação da
mesma classe, porém agora usando o GET e SET, protegendo assim
a implementação da classe e ampliando o encapsulamento.
Os métodos GET e SET permitem acessar as propriedades priva-
das da classe sem que haja a necessidade de acessar diretamente
aquela variável, não necessitando torná-la pública para todo o seu
programa. Vamos chamar isso de controle de acesso. Este controle
de acesso permite que apenas o objeto da classe derivada obtenha
valores e inclua valores nas variáveis da classe através dos métodos
104
CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA A OBJETOS COM C#
GET e SET.
Vamos ao exemplo com GET e SET. Na pasta CAP5, crie uma sub-
-pasta OlaMundo_GetSet e o arquivo Program.cs. O código a seguir
abaixo é idêntico ao anterior, só que agora realizamos algumas
modificações. Primeiro, abstraímos ainda mais a classe InteracaoU-
suario fazendo com que ela não apenas receba e imprima o valor
digitado no console, realizando assim a operação completa.
Segundo, criamos uma propriedade para a classe chamada Men-
sagem e através dela é que iremos recuperar a mensagem que foi
digitada para futura manipulação no programa. Usamos o SET para
atribuir um valor e o GET para ler o valor em si.
Terceiro, implementamos no programa principal a manipulação
da mensagem que foi apresentada pela classe. Realizamos isso re-
cebendo a mensagem digitada lendo a propriedade Mensagem, ma-
nipulando o valor desta propriedade na variável Digitado. Observe
que estamos colocando tudo em Maiúsculas (ToUpper) e solicitan-
do que seja impresso o novo valor digitado.
using System;
namespace MinhaPrimeiraClasse
{
class Pr ogramaPrincipal
{
static void Main(string[] args)
{
//Criamos o objeto Pedido herdado da clase
InteracaoUsuario
InteracaoUsuario Pedido = new InteracaoUsu
ario();
//Invocamos os metodos do objeto Pedido
herdado da classe mãe Interacao Usuario
Pedido.SolicitarDigitacao();
105
C# PARA INICIANTES
Pedido.MostrarDigitacao();
//Recupero pelo metodo GET o valor da
mensgaem digitada para futura manipulação
var Digitado = Pedido.Mensagem;
//Escrevo a nova mensagem colocando toda a
mensagem em Maiuscula
Console. WriteLine(“Nova Digitação sem Espaç
os -> “ + Digitado.ToUpper());
}
}
//Criamos a Classe InteracaoUsuario com dois
metodos principais
//Metodo que solicita a digitacao de algo no
terminal
//Metodo que mostra o que retorna o que foi
digitado
class InteracaoUsuario
{
private string _MensagemDigitada;
public string Mensagem
{
get
{
return _MensagemDigitada;
}
set
{
_MensagemDigitada = value;
}
}
public void SolicitarDigitacao()
{
_MensagemDigitada = Console.ReadLine();
106
CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA A OBJETOS COM C#
}
public void MostrarDigitacao( )
{
Console.WriteLine(_MensagemDigitada);
}
}
}
Vamos melhorar o projeto transformando a classe em um ar-
quivo .CS, em uma classe que pode não apenas ser usada no pro-
grama, mas em outros programas que necessitem da classe Intera-
caoUsuario.
Na mesma pasta CAP5 crie uma subpasta OlaMundo_GetSet_
Classe e o arquivo Classe_Interacao.cs. Atenção ao nome do names-
pace MinhaClasseUsuario, o qual será usado no Program.cs.
using System;
//Classe InteracaoUsuario com d ois metodos
principais
//Metodo que solicita a digitacao de algo no
terminal
//Metodo que mostra o que foi digitado
namespace MinhaClasseUsuario
{
public class InteracaoUsuario
{
private string _MensagemDigitada;
public string Mensagem
{
107
C# PARA INICIANTES
get
{ return _MensagemDigitada; }
set
{ _MensagemDigitada = value; }
}
public void SolicitarDigitacao()
{
_MensagemDigitada = Console.ReadLine();
}
public void MostrarDigitacao( )
{
Console.WriteLine(_MensagemDigitada);
}
}
}
Em seguida, na mesma pasta OlaMundo_GetSet_Classe crie o
arquivo Program.cs. Atente ao using MinhaClasseUsuario, que é o
namespace da classe anterior (InteracaoUsuario), afinal ela será re-
ferenciada neste código. É importante usar um namespace de fácil
assimilação, facilitando o entendimento do programa. Neste caso,
o namespace desta classe é MinhaPrimeiraClasse, o qual referencia
no using MinhaClasseUsuario a classe a ser usada neste código.
using System;
using MinhaClasseUsuario;
namespace MinhaPrimeiraClasse
{
class ProgramaPrincipal
{
108
CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA A OBJETOS COM C#
static void Main(string[] args)
{
//Criamos o objeto Pedido herdado da clase
InteracaoUsuario
InteracaoUsuario Pedido = new InteracaoUsu
ario();
//Invocamos os metodos do objeto Pedido
herdado da classe mãe InteracaoUsuario
Pedido.SolicitarDigitacao();
Pedido.MostrarDigitacao();
//Recuperamos pelo metodo GET o valor da
mensgaem digitada para futura manipulação
var Digitado = Pedido.Mensagem;
//Escrevemos a nova mensagem colocando
toda a mensagem em Maiuscula
Console. WriteLine(“Nova Digitação sem Espaç
os -> “ + Digitado.ToUpper());
}
}
}
Até aqui conseguimos entender os conceitos básicos de criação
da classe e por sua vez a criação de objetos herdados de uma classe
mãe que permitirá derivar, organizar, garantir acesso, proteger, es-
tender e reutilizar o código fonte em diversas situações. Mas vamos
agora com C# colocar em prática os quatro principais pilares da
orientação a objetos que comentamos no começo deste capítulo.
Antes disso vamos entender o que são os construtores de uma
109
C# PARA INICIANTES
classe, sem dúvida utilíssimos em uma programação orientada a
objeto. Até o momento não usamos construtores, isso já é uma evi-
dência de que seu uso não é mandatório nem obrigatório em uma
classe. Mas ainda assim vamos estudar seu conceito, sua utilidade
e como podemos criar um construtor em C#. Aqui vamos dar início
ao principal projeto em C# que irá nortear os principais pilares da
orientação a objetos até o final deste capítulo.
Existem vários artigos sobre orientação a objetos, e muitos deles
usam carros e seus modelos para explicar OOP, outros usam pes-
soas e animais para explicar a classe e modelo. Neste código vamos
usar um controle de livros em uma biblioteca. Criaremos uma clas-
se que ajudará a controlar nossa biblioteca, nossos livros. No final,
veremos particularidades inseridas no C# que também faz parte da
OOP e que podem ser muito úteis no dia a dia.
Poderá encontrar este código completo em cada uma de suas
versões no GIT chamado “Biblioteca”. Para que haja um melhor
acompanhamento de sua leitura, a cada evolução de código, den-
tro do repositório “Biblioteca” temos as versões de cada evolução
“Biblioteca_V1”, “Biblioteca_V2”, e assim por diante.
Dentro da pasta CAP5, crie a subpasta Biblioteca e dentro dela
a subpasta “Biblioteca_V1”. Relembrem no programa anterior de
interação com o usuário, onde usamos os comandos Console.Wri-
teline e Console.ReadLine. O último passo foi criar uma classe que
pudesse estar independente do programa principal e ser utilizada
em todo e qualquer projeto. A ideia aqui é igual, o programa de
controle de livros na biblioteca será independente.
Adicione o arquivo LibraryClass.cs, conforme o código a seguir.
//namespace eque irá conter a classe de controle d
e livros e seus metodos
namespace Libraryclass
{
//principal classe de controle de livros na
110
CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA A OBJETOS COM C#
Biblioteca
public class Biblioteca
{
private string _Titulo; //recebe o titulo do livro
private string _Autor; //
recebe o nome do autor do Livro
private int _Paginas; ///recebe o númerp de
paginas que o Livro contem
private bool _Status; //recebe saindo (FALSE) ou
entrando (TRUE) na biblioteca
public Biblioteca() //Construtor sem parametros
{
}
//Construtor com parametros
public Biblioteca( string Titulo, string Autor, in
t Paginas, bool Status)
{
_Titulo = Titulo;
_Autor = Autor;
_Paginas = Paginas;
_Status = Status;
}
public string Titulo //Metodo para acesso a
propriedade Titulo da classe
{
get {return _Titulo;} set { _Titulo = value;}
}
public string Autor
{
get {return _Autor;} set { _Autor = value;}
}
public int Paginas
{
get { return _Paginas;} set { _Paginas = value;}
111
C# PARA INICIANTES
}
public bool Status
{
get {return _Status;} set { _Status = value;}
}
}
}
Note que neste código não aplicamos o construtor, na verda-
de todas as vezes precisarmos de um objeto do tipo Biblioteca, te-
remos que chamar as propriedades GET e SET que são chamadas
quando designamos um valor para estas propriedades ou quando
solicitamos seu valor atual.
Vamos criar o construtor da Biblioteca usando outro pilar conhe-
cido em orientação a objetos chamado Sobrecarga ou em inglês,
overloading. Este pilar permite ter dois métodos dentro de uma clas-
se com o mesmo nome, porém com diferentes parâmetros, o que
terão diferentes resultados.
Em seguida, adicione o arquivo Program.cs para referenciar a
classe Biblioteca. Atenção ao using LibraryClass declarado para ter-
mos acesso à classe Biblioteca.
using System;
using Libraryclass;
namespace Biblioteca_V1
{
class Pr ogram
{
static void Main(string[] args)
{
//Inicializando a classe com o construtor nulo
Biblioteca MinhaBiblioteca = new Biblioteca();
//Por isso a necessidade de setar o valor de
112
CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA A OBJETOS COM C#
cada propriedade
MinhaBiblioteca.Autor = “Des Dearlove”;
MinhaBiblioteca.Titulo = “O Estilo Bill Gates
de Gerir”;
MinhaBiblioteca.Paginas = 203;
MinhaBiblioteca.Status = true;
//imprimindo os valores da classe
Console.WriteLine(“Autor: “+ MinhaBibliotec
a.Autor );
Console.WriteLine(“Titulo: “+ MinhaBiblioteca.
Titulo);
Console.WriteLine(“Paginas: “+ MinhaBibliote
ca.Paginas);
Console. WriteLine(“Status: “+MinhaBibliotec
a.Status);
Console.WriteLine();
//Inicializando a classe com o novo construtor
Biblioteca MeusLivros = new Biblioteca( “Jua
n Garcia Sola”, “Linguagem C”, 296, true);
//imprimindo os valores da classe
Console.WriteLine(“Autor: “+ MeusLivros.
Autor);
Console.WriteLine(“Titulo: “+ MeusLivros.Titulo);
Console. WriteLine(“Paginas: “+MeusLivros.
Paginas);
Console.WriteLine(“Status: “+ MeusLivros.
Status);
Console.WriteLine();
}
}
}
Note que classe Biblioteca já possui um construtor da classe,
porém não declarado, afinal de contas se este construtor não exis-
tisse não conseguiríamos criar o objeto MinhaBiblioteca. Quando
chamamos o código Biblioteca MinhaBiblioteca = new Biblioteca();
113
C# PARA INICIANTES
estamos chamando o construtor desta classe e criando um objeto,
baseado na classe Biblioteca em que a construção desta classe não
tem parâmetros. Por isso apenas com a chamada new Biblioteca()
invocamos implicitamente o construtor da classe e assim um novo
objeto é criado, sem dados, sem autor, sem título, sem nada, uma
classe vazia. O objetivo de declarar explicitamente o construtor será
útil para no momento de invocarmos a criação de um objeto, já
indicarmos quais serão os valores das propriedades deste objeto,
sem a necessidade de chamar o código a seguir:
MinhaBiblioteca.Autor = “Des Dearlove”;
MinhaBiblioteca.Titulo = “O Estilo Bill Gates de Gerir”;
MinhaBiblioteca.Paginas = 203;
MinhaBiblioteca.Status = true;
E como a classe contém dois construtores, temos duas maneiras
de inicializar a classe, prova disso é que no Program.cs aparece a
sobrecarga de um método. Ao invocar o new temos duas maneiras
de inicializarmos a classe, com parâmetros e sem parâmetros, con-
forme a figura a seguir.
Figura 21 – Sobrecarga de métodos
Note que no código do construtor com parâmetros não há ne-
cessidade de setar as propriedades porque elas já são configuradas
em tempo de execução do programa, no momento da chamada no
construtor.
Biblioteca MeusLivros = new Biblioteca( “Juan Garcia
Sola”, “Linguagem C”, 296, true);
Até aqui nosso programa está indo muito bem. Entendemos so-
114
CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA A OBJETOS COM C#
bre Classe, método, propriedade, construtor, sobrecarga. Concei-
tos importantes pra entendermos e programarmos corretamente
em C#, já que é uma linguagem nativamente orientada a objetos.
Vamos evoluir, vamos falar um pouco agora sobre herança. Heran-
ça é um dos atributos fundamentais da programação orientada
a objeto. Ela permite que você defina uma classe filha que reuti-
liza (herda), estende ou modifica o comportamento de uma clas-
se pai. A classe cujos membros são herdados é chamada de classe
base. A classe que herda os membros da classe base é chamada
de classe derivada.
Dentro da pasta CAP5 e da subpasta Biblioteca, crie a subpasta
Biblioteca_V2 e o arquivo Libraryclass.cs. Vamos criar uma classe
herdada da classe principal Biblioteca. Até aqui a classe base Biblio-
teca está controlando os livros de uma biblioteca. Porém, agora a
biblioteca recebe também revistas e precisamos ter o controle do
mês e ano da revista, já que geralmente as revistas são mensais.
Note que aqui temos duas novas propriedades (mês e ano) que não
faz sentido serem incluídas na classe base. Mas, por outro lado as
revistas possuem todas as propriedades do livro (autor, páginas,
etc) e necessitam que sejam adicionados o mês e o ano. Resolvere-
mos isso com herança.
No arquivo Libraryclass.cs crie uma nova classe chamada Revis-
tas que é herdada da classe Biblioteca, o qual possui todos os méto-
dos que a revista também necessita. Para que a herança aconteça
utilizamos o modificador “:” (dois pontos), sendo:
public class Revistas : Biblioteca
Pronto, com esta declaração criamos a classe para controlar as
revistas, herdando todas as características que possuem a classe
mãe, sem que tenhamos que reescrever novamente as proprieda-
des e métodos, pois herdamos todos eles na classe derivada para
controlar as revistas. Veja o código completo a seguir.
//namespace que irá conter a classe de controle de
115
C# PARA INICIANTES
livros e seus metodos
namespace Libraryclass
{
//nova classe para controlar as revistas
public class Revistas : Biblioteca
{
//Propriedades da Classe
private int _MesPublicacao;
private int _AnoPublicacao;
//Construtor da classe
public Revistas(int MesPublicacao, int AnoPubli
cacao)
{
_MesPublicacao = MesPublicacao;
_AnoPublicacao = AnoPublicacao;
}
public int MesPublicacao //Metodo para acesso
a propriedade da classe
{
ge t {return _MesPublicacao;} set { _
MesPublicacao = value;}
}
public int AnoPublicacao
{
get {return _AnoPublicacao;} set { _
AnoPublicacao = value;}
}
}
//principal classe de controle de livros na
Biblioteca
public class Biblioteca
{
private string _Titulo; //recebra o titulo do livro
private string _Autor; //recebera o nome do
autor do Livro
private int _Paginas; ///receberá o númerp de
paginas que o Livro contem
116
CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA A OBJETOS COM C#
private bool _Status; //receberá saindo (FALSE)
ou entrando (TRUE) na biblioteca
public Biblioteca() //Construtor sem parametros
{
}
//Construtor com parametros
//note que o nome do metodo é o mesmo
(sobrecarga)
public Biblioteca( string Titulo, string Autor, in
t Paginas, bool Status)
{
_Titulo = Titulo;
_Autor = Autor;
_Paginas = Paginas;
_Status = Status;
}
public string Titulo //Metodo para acesso a
propriedade da classe “Titulo”
{
get {return _Titulo;} set { _Titulo = value;}
}
public string Autor
{
get {return _Autor;} set { _Autor = value;}
}
public int Paginas
{
get { return _Paginas;} set { _Paginas = value;}
}
public bool Status
{
get {return _Status;} set { _Status = value;}
}
}
}
117
C# PARA INICIANTES
Nesta mesma pasta Biblioteca_V2, crie o arquivo Program.cs que
irá referenciar e consumir a classe Revista.
Note que na chamada do construtor da classe Revista são pas-
sados os parâmetros mês e ano. Em seguida são inicializadas as
outras propriedades que também são importantes para o objeto
Revista herdado de Biblioteca.
Para efeito de deixar o código mais limpo no Console.WriteLine,
na segunda linha do using declaramos o using static System.Console,
fazendo com que usemos apenas o WriteLine.
using System;
using static System.Console;
using Libraryclass;
namespace Biblioteca_V2
{
class Program
{
static void Main( string[] args)
{
//inicializando nossa nova classe com herança
Revistas MinhasRevistas = new Revistas( 3, 20
21);
//Inicializando as outas propriedades da
classe que foram herdadas
MinhasRevistas.Autor = “Microsoft”;
MinhasRevistas.Titulo = “MSDN Magazine”;
MinhasRevistas.Paginas = 20;
MinhasRevistas.Status = true;
//imprimindo os valores de minha classe
WriteLine(“Revista Mes: “+ MinhasRevistas.
MesPublicacao);
WriteLine(“Revista Ano: “+ MinhasRevistas.
AnoPublicacao);
WriteLine(“Revista Autor: “+ MinhasRevistas.
Autor);
118
CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA A OBJETOS COM C#
WriteLine(“Revista Titulo: “+ MinhasRevistas.
Titulo);
WriteLine(“Revista Paginas: “+ MinhasRevista
s.Paginas);
WriteLine(“Revista Status: “+ MinhasRevistas.
Status);
WriteLine();
//Inicializando nossa classe com o construto
r nulo
Biblioteca MinhaBiblioteca = new Biblioteca()
;
//Por isso a necessidade de “setar” o valor
de cada propriedade
MinhaBiblioteca.Autor = “Des Dearlove”;
MinhaBiblioteca.Titulo = “O Estilo Bill Gates
de Gerir”;
MinhaBiblioteca.Paginas = 203;
MinhaBiblioteca.Status = true;
//imprimindo os valores de minha classe
WriteLine(“Autor: “+ MinhaBiblioteca.Autor);
WriteLine(“Titulo: “+MinhaBiblioteca.Titulo);
WriteLine(“Paginas: “+MinhaBiblioteca.Paginas);
WriteLine(“Status: “+MinhaBiblioteca.Status);
WriteLine();
//Inicializando nossa classe com o novo
construtor
Biblioteca MeusLivros = new Biblioteca( “Jua
n Garcia Sola”, “Linguagem C”, 296, true);
//imprimindo os valores de minha classe
WriteLine(“Autor: “+ MeusLivros.Autor);
WriteLine(“Titulo: “+MeusLivros.Titulo);
WriteLine(“Paginas: “+MeusLivros. Paginas);
WriteLine(“Status: “+MeusLivros.Status);
WriteLine();
}
119
C# PARA INICIANTES
}
}
Salve o projeto (CTRL+S) e execute (F5) para ver o resultado.
Autor: Des Dearlove
Titulo: O Estilo Bill Gates de Gerir
Paginas: 203
Status: True
Autor: Linguagem C
Titulo: Juan Garcia Sola
Paginas: 296
Status: True
Vamos abordar agora o polimorfismo, outro pilar da orientação
a objetos e que nos ajudará a codificar melhor, mais rápido e reuti-
lizando código. O principal conceito do polimorfismo é a proprieda-
de de duas ou mais classes derivadas de uma mesma superclasse
responderem a mesma mensagem cada uma de uma forma dife-
rente, mas utilizam o mesmo método que outrora foi sobrescrito.
Vamos ver isso na prática, vamos complicar um pouco mais nos-
so controle na biblioteca. Agora, além de controlar livros e revistas
precisamos controlar Fotos, com o agravante que jornal tem todas
as características de um livro, possui (Autor, Título, etc), porém um
novo campo que chamaremos de Tipo, o qual armazenará o valor
Colorido ou Preto e Branco.
Já aprendemos neste capítulo como resolver isso, basta criar-
mos a classe Fotos herdada da classe Revistas, assim teremos todas
as propriedades à disposição para trabalhar sem precisar reescre-
ver. Vamos fazer isso antes de aplicarmos polimorfismo.
//classe para controlar as fotos
public class Fotos : Revistas
{
//Propriedades da Classe
120
CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA A OBJETOS COM C#
private string _Tipo;
//neste construtor preciso referenciar a classe
base
//Revistas é uma classe já herdada de Biblioteca
public Fotos( string Tipo) : base (0,0)
{
_Tipo = Tipo;
}
public s tring Tipo //Metodo para acesso a
propriedade da classe
{
get {return _Tipo;} set { _Tipo = value;}
}
}
Para consumir a classe Fotos, no Program.cs adicione o código
a seguir. Criamos o objeto MinhasFotos derivada da classe Fotos e
designo valores para suas propriedades. Note que a classe Minhas-
Fotos possui todas as propriedades e métodos que foram herdados
da classe Revistas que por sua vez herdou da classe Biblioteca.
static void Main( string[] args)
{
//inicializando nossa nova classe Fotos
Fotos MinhasFotos = new Fotos( “Colorida”);
MinhasFotos.AnoPublicacao = 2021;
MinhasFotos.MesPublicacao = 3;
MinhasFotos.Autor = “Desconhecido”;
MinhasFotos.Titulo = “Vida Eterna”;
MinhasFotos.Paginas = 1;
MinhasFotos.Status = true;
//imprimindo os valores de minha classe
WriteLine(“Foto Tipo: “+ MinhasFotos.Tipo);
WriteLine( “Foto Mes: “+ MinhasFotos. MesPublicacao);
WriteLine(“Foto Ano: “+ MinhasFotos.AnoPublicacao);
WriteLine(“Foto Autor: “+ MinhasFotos.Autor);
WriteLine(“Foto Titulo: “+ MinhasFotos.Titulo);
121
C# PARA INICIANTES
WriteLine(“Foto Paginas: “+MinhasFotos. Paginas);
WriteLine(“Foto Status: “+ MinhasFotos.Status);
WriteLine();
Agora entra a utilidade do polimorfismo, ou seja, a classe ob-
tém múltiplas formas e múltiplos comportamentos. Vamos agora,
dentro de nosso exercício proposto, criar um método de descarte
do Livro, da revista e da Foto. Todos terão o mesmo objetivo de
descartar, porém para cada um o descarte é realizado de maneira
diferente, o jornal é reciclado, o livro é doado e a foto é destruída.
Para solucionar este problema podemos criar um método base na
classe base chamado Descarte e designar diferentes comportamen-
tos nas classes derivadas.
Veja os métodos Descarte nas classes Biblioteca, Revistas e Fotos.
Note que a propriedade Titulo de cada classe tem um texto diferen-
te. Nas classes derivadas Revistas e Fotos, a declaração da proprie-
dade Titulo, usamos o this, o qual indica que é desta classe.
namespace Libraryclass
{
//classe para controlar as fotos
public class Fotos : Revistas
{
//Propriedades da Classe
private string _Tipo;
...
public string Tipo //Metodo para acesso a
propriedade daclasse {
get {return _Tipo;} set { _Tipo = value;}
}
public override void Descarte()
{
this.Titulo = “A Foto foi Destruida”;
}
}
122
CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA A OBJETOS COM C#
//nova classe para controlar as revistas
public class Revistas : Biblioteca
{
//Propriedades da Classe
private int _MesPublicacao;
private int _AnoPublicacao;
...
public int AnoPublicacao
{
get {return _AnoPublicacao;} set { _
AnoPublicacao = value;}
}
public override void Descarte()
{
this.Titulo = “A Revista foi Reciclada”;
}
}
//principal classe de controle de livros na
Biblioteca
public class Biblioteca
{
private string _Titulo; //recebra o titulo do livro
...
...
public bool Status
{
get {return _Status;} set { _Status = value;}
}
//Método Descarte
public virtual void Descarte()
123
C# PARA INICIANTES
{
_Titulo = “O Livro foi Doado”;
}
}
}
No Program.cs, adicione este bloco de código no final, assim te-
remos os objetos de foto, jornal e o livro na biblioteca com os res-
pectivos descartes.
//Mesmo método com comportamentos diferentes
MeusLivros.Descarte();
WriteLine( “Titulo: “+MeusLivros.Titulo);
MinhasRevistas.Descarte();
WriteLine(“Titulo: “+ MinhasRevistas.Titulo);
MinhasFotos.Descarte();
WriteLine(“Titulo: “+ MinhasFotos. Titulo);
WriteLine();
Este é o resultado esperado ao rodar o programa.
Salve o projeto (CTRL+S) e execute (F5) para ver o resultado.
Foto Tipo: Colorida
Foto Mes: 3
Foto Ano: 2021
Foto Autor: Desconhecido
Foto Titulo: Vida Eterna
Foto Paginas: 1
Foto Status: True
124
CAPÍTULO 5 - PROGRAMAÇÂO ORIENTADA A OBJETOS COM C#
Revista Mes: 3
Revista Ano: 2021
Revista Autor: Microsoft
Revista Titulo: MSDN Magazine
Revista Paginas: 20
Revista Status: True
Autor: Des Dearlove
Titulo: O Estilo Bill Gates de Gerir
Paginas: 203
Status: True
Autor: Linguagem C
Titulo: Juan Garcia Sola
Paginas: 296
Status: True
Titulo: O Livro foi Doado
Titulo: A Revista foi Reciclada
Titulo: A Foto foi Destruida
125