Você está na página 1de 269

EDUCAÇÃO

PROGRAMAÇÃO E NOVAS
ORIENTADA
TECNOLOGIAS
A OBJETOS I

LIVRO-TEXTO

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


1
Centro Universitário do Planalto de Araxá
UNIARAXÁ

PROGRAMAÇÃO ORIENTADA
A OBJETOS I
Prof. Me. Robinson Crusoé da Cruz

2020
UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS
2
FICHA CATALOGRÁFICA

FICHA CATALOGRÁFICA
Maria Clara Fonseca
Bibliotecária – CRB 6 / 942

Cruz, Robinson Crusoé da


C957p Programação orientada a objetos I. / Robinson Crusoé da
Cruz. - Araxá: UNIARAXÁ; 2020.
269p.: PDF: 33.710 KB.

ISBN: 978-85-99750-84-1

1.Orientação a objetos. 2. Coleção de dados. 3. Métodos


construtores - Destrutores. I. Título.

CDU: 004.421

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


3
FICHA TÉCNICA
Reitor Prof. Me. José Oscar de Melo
Pró-Reitor de Ensino Pesquisa e Extensão Prof. Dr. Fabrício Borges de Oliveira

COORDENAÇÃO
Coordenador EAD Prof. Me. Waldecy Lima
Núcleo Pedagógico Esp. Joice Aparecida Pereira
Profª. Ma. Ivana Lodi

Produção de Mat. Didáticos Esp. Fernando Carlos Chadu Santos


Acompanhamento de Polos Esp. Nádia Mara Dumont

EQUIPE MULTIDISCIPLINAR
Designers Instrucionais Esp. Fernanda de Mello Macedo
Revisores Textuais Profª. Drª. Adriene Coimbra
Profª. Ma. Nad Pereira
Prof. Dr. Nélio Araújo Martins
Diagramadores Tarcísio Fernando Antunes
Loren Cristiene dos Santos
Designers Multimídia Kariolando Januário da Silva
Suporte Técnico Raphael Lacerda
Suporte Acadêmico Esp. Evelin Figueiredo
Secretaria Marli Cruz
Naraiane Secundino

Não estão autorizadas nenhuma forma de reprodução, parcial ou integral deste material,
UNIARAXÁ - CENTRO
sem UNIVERSITÁRIO
autorização DO PLANALTO
expressa DE ARAXÁ • TODOS OS DIREITOS RESERVADOS
do UNIARAXÁ. 4
SUMÁRIO
SOBRE O AUTOR 7
GUIA DA DISCIPLINA 8
APRESENTAÇÃO DA DISCIPLINA 19
AULA 1 21
AULA 1 – INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETOS (POO) 22
FOLHA DE RESPOSTAS 54
CRÉDITOS 56
REFERÊNCIAS 57
AULA 2 58
AULA 2 - INTRODUÇÃO A LINGUAGEM C# E UMA REVISÃO SOBRE LÓGICA COMPUTACIONAL 59
AULA 2 - INTRODUÇÃO A LINGUAGEM C# E UMA REVISÃO SOBRE LÓGICA COMPUTACIONAL 60
REFERÊNCIAS 92
AULA 3 93
AULA 3 - DESENVOLVENDO SOFTWARE ORIENTADO A OBJETOS - PARTE I 94
DESENVOLVENDO SOFTWARE ORIENTADO A OBJETOS - PARTE I 95
FOLHA DE RESPOSTAS 122
REFERÊNCIAS 125
AULA 4 126
AULA 4 - DESENVOLVIMENTO DE SOFTWARE ORIENTADO A OBJETOS - PARTE II 127
PROJETOS POO E CONCEITOS 128
REFERÊNCIAS 154
AULA 5 155
AULA 5 - DESENVOLVENDO SOFTWARE ORIENTADO A OBJETOS - PARTE III 156
DESENVOLVENDO SOFTWARE ORIENTADO A OBJETOS - PARTE III 157
REFERÊNCIAS 182
AULA 6 183
AULA 6 - DESENVOLVENDO DE SOFTWARE ORIENTADO A OBJETOS - PARTE IV 184

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


5
DESENVOLVENDO SOFTWARE ORIENTADO A OBJETOS - PARTE IV 185
REFERÊNCIAS 210
AULA 7 211
AULA 7 - PROGRAMAÇÃO ORIENTADA A OBJETOS E AS LINGUAGENS DE PROGRAMAÇÃO 212
DESENVOLVENDO SOFTWARE ORIENTADO A OBJETOS - PARTE V 213
REFERÊNCIAS 239
AULA 8 240
AULA 8 - REVISANDO 241
OUTRAS ESTRUTURAS DA LINGUAGEM C# E REVISÃO SOBRE POO 242
REFERÊNCIAS 268

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


6
SOBRE O AUTOR

PROF. ME. ROBINSON CRUSOÉ DA CRUZ

Mestre na área de Metodologias e Técnicas de Computação pelo Programa de Pós-graduação


em Sistemas de Informação da USP (Universidade de São Paulo), com ênfase em pesquisas na
área de Engenharia de Software. Especialista em Banco de Dados (UNITRI) e Graduado em
Sistemas de Informação (UNIARAXÁ). Atualmente atua como Docente nos cursos de Sistemas
de Informação, Engenharia de Produção, Engenharia Civil e Pós-graduação em Banco de
Dados, Engenharia de Software e Análise de Desenvolvimento de Sistemas (EAD) do Centro
Universitário do Planalto de Araxá. Possui interesses na área de Engenharia de Software,
Mineração de Dados, Business Intelligence, Banco de Dados e Linguagens de Programação.
Experiência de mais de 20 anos na área de Tecnologia da Informação. Atua no mercado com
projetos de BI (Business Intelligence), desenvolvimento de ERP (Enterprise Resource Planning)
com ênfase na Plataforma .NET e como DBA em SQL Server.

Currículo: http://lattes.cnpq.br/7799575672355230

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


7
GUIA DA DISCIPLINA

1. Iniciando os Estudos
Seja bem-vindo(a)!

Você está iniciando o estudo sobre Programação Orientada a Objetos I, uma disciplina curricular
do seu curso, que será desenvolvida na modalidade EAD (Educação a Distância).

Atualmente, a empregabilidade na área de TI (Tecnologia da Informação) está em alta.


São milhares de vagas disponíveis no mercado, em especial, existe uma forte demanda por
profissionais de desenvolvimento de software. Contudo, para entrar no mercado não é necessário
apenas conhecer tecnologias e/ou ser um desenvolver. Você precisa ter conhecimentos sólidos
para te auxiliar durante sua vida profissional.

A disciplina de Programação Orientada a Objetos (POO) irá te auxiliar a compreender e


desenvolver produtos de software com o paradigma mais utilizado no mercado. Além disso,
durante a disciplina você terá contato com a linguagem C# que está entre as linguagens de
programação mais utilizadas.

VIDEOAULA
Além das informações/orientações contidas nesse Guia de
Disciplina, para uma ampla ambientação ao estudo dessa
disciplina, convidamos você a acessar o Tutorial do Ambiente
Virtual de Aprendizagem e a SAV (Sala de Aula Virtual) desta
disciplina, bem como a assistir à Videoaula de Apresentação da
disciplina Programação Orientada a Objetos I.

DICA DO AUTOR
Caso você tenha alguma dúvida sobre os procedimentos e/ou ações que
precisará realizar no decorrer do estudo dessa disciplina, é importante que entre
em contato com o(a) Tutor(a) do Curso e com seus colegas de turma no AVA
(Ambiente Virtual de Aprendizagem). Estamos preparados para atendê-lo(a),
ajudá-lo(a) a superar seus desafios e a atingir seus objetivos.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


8
2. Sinopse da Disciplina
Conceitos básicos de orientação a objetos: classe, objeto, mensagens, encapsulamento,
herança, polimorfismo, ligação dinâmica, sobrecarga e sobreposição de métodos. Coleção
de dados. Métodos Construtores e Destrutores. Classes Abstratas e Interfaces. Enumeradores.
Tratamento de exceções. Classes Genéricas.

3. Objetivos e Competências da Disciplina


A seguir, você irá conhecer os referenciais que nortearão os estudos da disciplina Programação
Orientada a Objetos I .

Quadro 1 Objetivos e Competências da Disciplina: Programação Orientada a Objetos I

Objetivo Geral
• Desenvolver produtos de software e aprender sobre o paradigma orientado a objetos.

Objetivos Específicos

• Identificar a diferença entre os paradigmas de programação.


• Aplicar conceitos de abstração na modelagem de software
Aula 1 - Introdução à orientado a objetos.
Programação Orientada a • Distinguir os diversos conceitos sobre linguagem de
Objetos (POO) programação.
• Praticar modelagem de projetos orientado a objetos.
• Reconhecer a história da programação orientada a objetos.

• Analisar a estrutura de da tecnologia .NET.


• Desenvolver programas no paradigma estruturado na
Aula 2 - Introdução a Linguagem C#.
linguagem C# • Reconhecer os tipos de dados.
• Revisar sobre lógica de programação utilizando a linguagem
C#.

• Manipular strings.
Aula 3 - Desenvolvendo
• Trabalhar com listas e arrays.
software orientado a
• Desenvolver Projetos OO na linguagem C#.
objetos - Parte I.
• Estudar sobre a Manipulação dos tipos de dados.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


9
• Criar Projetos Orientado a Objetos na linguagem C#.
Aula 4 - Desenvolvendo
• Aplicar os conceitos de POO em Projetos de Software.
software POO - Parte II.
• Trabalhar com tratamento de exceções.

• Desenvolver Projetos Windows Forms em C#.


Aula 5 - Desenvolvendo
• Aplicar conceitos de exceção.
Projetos Windows Forms -
• Desenvolver projetos em Windows Forms aplicando conceitos
Parte I.
de POO.

Aula 6 - Desenvolvendo • Desenvolver projetos Windows Forms.


Projetos Windows Forms - • Desenvolver projetos com Linq e Lambda.
Parte II. • Manipular Listas.

Aula 7 - Programação
Orientada a Objetos • Estudar sobre aplicação de programação Orientada a
e as linguagens de Objetos em outras linguagens.
programação
• Revisar o conteúdo que foi estudado na disciplina.
Aula 8 - Revisando... • Desenvolver o Projeto Final da disciplina.

Competências (Domínios Cognitivos, Habilidades e Atitudes)

• Modelar e implementar soluções de Tecnologia de Informação em variados domínios de


aplicação.
• Representar os modelos mentais dos indivíduos e do coletivo na análise de requisitos de
um Sistema de Informação.
• Aplicar conceitos, métodos, técnicas e ferramentas de gerenciamento de projetos em
sua área de atuação.
• Identificar e projetar soluções de alto nível e opções de fornecimento de serviços,
realizando estudos de viabilidade com múltiplos critérios de decisão.

Fonte: Acervo Pessoal

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


10
DICA DO AUTOR
Para assumir efetivamente uma postura autônoma em relação ao seu processo
de aprendizagem, é fundamental que conheça e reflita sobre os objetivos gerais,
específicos e as competências da disciplina, descritos no Quadro 1 - Objetivos
e Competências da Disciplina: Programação Orientada a Objetos I, uma vez
que eles representam as intenções educativas que esperamos que você e seus
colegas de turma desenvolvam no decorrer dos estudos aqui propostos.

Vale salientar que, no decorrer do processo de aprendizagem desta disciplina,


intentamos não apenas ajudá-lo a construir conhecimentos, mas também a
desenvolver suas capacidades cognitivas, interpessoais, éticas etc.

Assim, caso tenha críticas, comentários, sugestões ou elogios, acesse a SAV (Sala
de Aula Virtual) da disciplina e apresente-os para seus colegas de turma e para
o(a) Tutor(a) do Curso. Após reflexões, é possível que alterações sejam propostas
e efetivadas em benefício do processo de aprendizagem de todos!

Pense e repense continuamente seus processos de aprendizagem e participe.


Afinal, nós, também, queremos aprender com você!

4. Cronograma de Estudos da Disciplina


A disciplina Programação Orientada a Objetos I é composta por 8 (oito) Aulas, com dedicação
média de estudos de 9 (nove) horas cada, acrescidas de 2 (duas) horas para a realização
da Ambientação para o Estudo da Disciplina e 2 (duas) horas para a realização da AFPD
(Avaliação Final Presencial da Disciplina).

Possui, portanto, uma carga horária total de 80 horas, conforme sugerido no Quadro-
cronograma, descrito a seguir:

Quadro 2 Carga Horária, Modalidade e Cronograma Letivo

COMPONENTES CARGA-
MODALIDADE CRONOGRAMA LETIVO
CURRICULARES HORÁRIA
Ambientação para o
2h EAD 1ª Semana
Estudo da Disciplina
Aula 1 9h EAD
2ª e 3ª Semanas
Aula 2 9h EAD

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


11
Aula 3 9h EAD
4ª e 5ª Semanas
Aula 4 9h EAD

AC – Experiência de
Opcional: EAD e/ou
Aprendizagem Integrativa 2h 5ª Semana
Presencial
1 - Colaborativa

Aula 5 9h EAD
6ª e 7ª Semanas
Aula 6 9h EAD
Aula 7 9h EAD
8ª e 9ª Semanas
Aula 8 9h EAD
AC – Experiência de
Aprendizagem Integrativa 2h EAD 9ª Semana
2 - Individual

AFPD - Avaliação Final


2h Presencial 10ª Semana
Presencial da Disciplina
76h EAD
2h Presencial
SUBTOTAL –
Opcional: EAD e/ou
2h
Presencial
Total 80H 1º TRIMESTRE - SEMESTRE LETIVO
Fonte: Acervo Pessoal

importante
Para confirmar as datas, efetivamente, agendadas para a realização da AC –
Colaborativa e Integrativa das Aulas 1 a 4 (opcional no Polo de Apoio Presencial ou
EAD), da AFPD (Avaliação Final Presencial da Disciplina), você deverá consultar o
Calendário Acadêmico; e, em caso de dúvidas, acessar o AVA (Ambiente Virtual
de Aprendizagem) para contatar o(a) Professor(a) da Disciplina!

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


12
5. Avaliação do Processo de Aprendizagem
Avaliação da disciplina Programação Orientada a Objetos I ocorre mediante a participação/
elaboração e postagem da Avaliação Continuada (Praticando, Experiência de Aprendizagem
Colaborativa Integrativa e Experiência de Aprendizagem Individual Integrativa)A no AVA
(Ambiente Virtual de Aprendizagem) e a realização da AFPD (Avaliação Final Presencial da
Disciplina), conforme demonstra o Quadro 3:

A AC (Avaliação Continuada) da disciplina Programação Orientada


a Objetos I será proposta para a realização de três formas distintas
e fundamentais para o bom andamento do seu processo de
aprendizagem, são elas:

• Praticando: refere-se as questões de múltipla escolha, com cinco


alternativas para que escolha a correta e que valerão pontos
em sua NFD (Nota Final da Disciplina).
Ao escolher a alternativa, você já obterá um feedback automático,
no qual será informado(a) sobre o acerto ou erro cometido, bem
como com orientações do(a) Professor(a) da disciplina sobre os
motivos do eventual erro e/ou do acerto. Assim sendo, além de
valer pontos em sua NFD, esta avaliação representará mais uma
VOCÊ SABIA? importante oportunidade para ampliar seus conhecimentos sobre
os conteúdos estudados na disciplina.

• Experiência de Aprendizagem Integrativa 1- Colaborativa: refere-


se aos Fóruns, às Tarefas em Grupo e a outras interatividades
que serão propostas para participação opcional na SAV (Sala
de Aula Virtual) da disciplina e/ou presencialmente no Polo de
Apoio Presencial e que valerão pontos em sua NFD (Nota Final
da Disciplina).
Esse será o momento em que você trabalhará em processo de
colaboração com seus colegas de turma e terá possibilidades
sistemáticas de aprender (conteúdos e competências) em uma
Comunidade Virtual de Aprendizagem.

• Experiência de Aprendizagem Integrativa 2 - Individual: refere-


se às Tarefas, aos Exercícios, aos Testes e a outras atividades que
serão propostas no AVA (Ambiente Virtual de Aprendizagem) e
que valerão pontos em sua NFD (Nota Final da Disciplina).

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


13
Esse será o momento em que você trabalhará individualmente e,
no qual o(a) Tutor(a) do Curso poderá acompanhar seu processo
pessoal de aprendizagem; mediando a construção individual de
conhecimentos para ajudá-lo(a) a atingir o sucesso de seu processo
de aprendizagem dos conteúdos da disciplina e na formação
de competências que serão importantes para sua vida como
profissional na área de conhecimento e para sua vida pessoal.

Já a AFPD (Avaliação Final Presencial da Disciplina), será o momento


em que você deverá comparecer ao UNIARAXÁ ou no Polo em
que se inscreveu para realizar a avaliação proposta e evidenciar
os conhecimentos que adquiriu ao longo dos estudos da disciplina.

Quadro 3 Notas e Procedimentos Avaliativos da Disciplina

AVALIAÇÕES
MODALIDADE NOTA
AC - Avaliação Continuada

Aula 1 AC1 - Praticando EAD 0,10

Aula 2 AC2 - Praticando EAD 0,10

Aula 3 AC3 - Praticando EAD 0,10

Aula 4 AC4 - Praticando EAD 0,10

AC5 - Experiência de Aprendizagem Opcional: EAD e/ou


Aulas 1 a 4 1,50
Integrativa 1 - Colaborativa Presencial

Aula 5 AC6 - Praticando EAD 0,10

Aula 6 AC7 - Praticando EAD 0,10

Aula 7 AC8 - Praticando EAD 0,10

Aula 8 AC9 - Praticando EAD 0,10

AC10 - Experiência de Aprendizagem


Aulas 5 a 8 EAD 0,70
Integrativa 2 - Individual

Nota Final de AC (Avaliação Continuada) EAD 3,0

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


14
Nota Final de AFPD (Avaliação Final Presencial da
Presencial 7,0
Disciplina)
Nota Final da Disciplina 0 – 10,0
Aprovação: NFD ≥ 7, com Nota de AC ≥ 0,75
Fonte: Acervo Pessoal

Note que a sua NFD (Nota Final da Disciplina) é o resultado da soma das notas obtidas na
AC (Avaliação Continuada) e na AFPD (Avaliação Final Presencial da Disciplina), conforme
fórmula a seguir:

AC + AFPD = NFD

Sendo,

• AC = Avaliação Continuada

• AFPD= Avaliação Final Presencial da Disciplina

• NFD = Nota Final da Disciplina

Assim, para a aprovação, sua NFD deverá ser igual ou maior que 7,0 (sete), com nota de AC
igual ou superior a 0,75 (setenta e cinco décimos).

importante
Para saber mais sobre a NFD (Nota Final da Disciplina), a Avaliação Substitutiva
(condições e taxas), as possibilidades de Recuperação, incluindo a Prova Final
(cujo aproveitamento poderá ser de 60% [nota≥6,0]), a DP (Dependência) e
sobre outros componentes curriculares, consulte o Manual Acadêmico; e, para
conferir suas notas consulte a Central Acadêmica do UNIARAXÁ.

Para acessar a Central Acadêmica do UNIARAXÁ, siga os seguintes passos:

• 1º Passo: Acesse o site do UNIARAXÁ: <http://site.uniaraxa.edu.br/>.


• 2º Passo: Clique na opção “Portal RM”.
• 3º Passo: Clique em “Notas de Avaliação”.

Isso significa que, mesmo se tirar sete na AFPD, você só estará aprovado se tirar 0,75 ou mais
na AC (Avaliação Continuada). Em outras palavras, a participação no AVA (Ambiente Virtual
de Aprendizagem) será fundamental tanto para seu progresso no curso (já que a aprovação
também depende dela), quanto para o sucesso de seu processo de aprendizagem.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


15
DICA DO AUTOR
A aprovação na disciplina depende tanto da realização da AFPD (Avaliação
Final Presencial da Disciplina), quanto da elaboração/participação e postagem
da ACs (Avaliações Continuadas: Praticando, Experiência de Aprendizagem
Colaborativa Integrativa e Experiência de Aprendizagem Individual Integrativa)
no AVA (Ambiente Virtual de Aprendizagem). Assim, é fundamental que participe
ativamente do processo de aprendizagem, durante todo o estudo da disciplina,
postando suas ACs nos prazos e horários previamente estipulados.

A postagem é a realização das avaliações e o envio da ACs solicitadas em cada


Aula. Também chamamos “Postagem” tanto a “Entrega” da Experiência de
Aprendizagem Integrativa 1 - Individual, quanto as participações na Experiência
de Aprendizagem Integrativa 2 - Colaborativa no AVA. As postagens devem
ser realizadas até o horário limite estipulado. Assim, para evitar problemas de
cunho tecnológico, ou de outra ordem, trabalhe com antecedência, evitando
contratempos futuros.

Ah, em caso de dúvidas, lembre-se de que estamos, Professor(a) da disciplina e


colegas de turma, esperando você no AVA! Conecte-se e participe!

6. Bibliografia Básica

DICA DO AUTOR
As obras referenciadas nas Bibliografias Básica e Complementar, bem como da
Leitura Recomendada são importantes, tendo em vista a oportunidade para
ampliar e aprofundar seus conhecimentos sobre o tema de estudo dessa disciplina!
Assim, sugerimos que amplie as fronteiras de seu processo de aprendizagem,
consulte as obras indicadas!

FELIX, Rafael. Programação Orientada a Objetos. São Paulo: Pearson, 2016.

MANZANO, José Augusto N. G. Programação de computadores C#. São Paulo: Érica, 2014.

SINTES, Anthony. Aprenda programação orientada a objeto em 21 dias. São Paulo: Makron
Books, 2002.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


16
7. Bibliografia Complementar
BOOCK, Grandy; RUMBAUGH, James; JACOBSON , Ivar. UML guia do usuário: o mais avançado
tutorial sobre Unified Modeling Language (UML), elaborado pelos próprios criadores da
linguagem. 2 ed. Rio de Janeiro: Campus, 2006.

DAVID J. Barnes, Micheal Kölling. Programação Orientada a Objetos com Java - Uma introdução
prática usando o BLUEJ. Pearson, 2004.

DEITEL, H. M.; Deitel, P. J. C++ Como Programar: 3 ed. São Paulo: Bookman, 2001. 1098 p.

H. M. Deitel, P. J. Deitel. Java: Como Programar, 8a. Edição. Pearson, 2010.

FOWLER, Martin. UML Essencial: um breve guia para linguagem padrão. Porto Alegre: Bookman,
2005.

8. Leitura Recomendada
CAELUM; Apostila de C# e Orientação a Objetos - Acesso em: 01/01/2019. Disponível em:
https://www.caelum.com.br

9. Sites Recomendados
DEVMEDIA. Site com Material sobre Desenvolvimento. Acesso em: 01/01/2019. Disponível
em: https://www.devimedia.com.br
STACKOVERFLOW. Site de pergunta e respostas sobre Tecnologia da Informação. Acesso
em: 01/01/2019. Disponível em: https://www.stackoverflow.com

DICA DO AUTOR
Para localizar os filmes, séries, vídeos e games referenciados, sugerimos que realize
buscas nos meios que, convencionalmente, que você utiliza para encontrar esses
recursos quando os busca por entretenimento. Muito além de um passatempo,
com os conhecimentos que está adquirindo com o estudo dessa e de outras
disciplinas do Curso, você poderá utilizá-los como fontes críticas para ampliar seus
conhecimentos de forma lúdica e contextualizada!

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


17
UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS
18
APRESENTAÇÃO DA DISCIPLINA
Prezado(a) Estudante,

Estamos iniciando o estudo dos conteúdos sobre a disciplina Programação Orientada a Objetos
(POO) I, o qual ocorrerá ao longo de oito Aulas.

Na Aula 1, vamos estudar os conceitos básicos sobre programação orientada a objetos e a estrutura
das linguagens de programação.

Na Aula 2, vamos realizar uma revisão sobre lógica computacional e desenvolver alguns projetos
com o paradigma imperativo (estruturado) para que você possa conhecer a estrutura básica da
linguagem C#.

Na Aula 3, vamos estudar sobre estruturas complexas de armazenamento de dados e o


desenvolvimento de classes e objetos que são a base da programação orientada a objetos.

Na Aula 4, será o momento da abordagem das estruturas de herança, sobrecarga, métodos,


abstração e outros conceitos de POO. Assim como as demais aulas, serão apresentados exemplos e
você será estimulado(a) a desenvolver programas na linguagem C#.

Na Aula 5, vamos iniciar o desenvolvimento de programas orientado a objetos em projetos Windows


Forms.

Na Aula 6, vamos continuar desenvolvendo programas em Windows Forms. Entretanto, vamos


estudar algumas estruturas que são muito utilizadas no mercado: linq e lambda, manipulação de
listas entre outras.

Na Aula 7, será o momento de conhecer outras linguagens de programação orientada a objetos.

Na Aula 8, chegou a hora de criarmos o nosso projeto final. Nesta aula será proposto o desenvolvimento
de um projeto de software com os principais conceitos que foram abordados na disciplina.

Para atingir os objetivos de aprendizagem propostos, desenvolver competências, efetivar os estudos


em sua totalidade e construir os conhecimentos necessários para a realização da ACs (Avaliações
Continuadas: Praticando, Experiência de Aprendizagem Integrativa I - Colaborativa e Experiência de
Aprendizagem Integrativa 2 - Individual), é importante que leia atentamente no Conteúdo das Aulas.

Para que os conceitos teóricos e práticos possam ser bem compreendidos, é fundamental que
você faça estudos complementares por meio de textos e vídeo aulas disponíveis na web, resolva os
exercícios propostos e utilize os fóruns da comunidade de desenvolvedores para sanar suas dúvidas.

Agora que você deu o primeiro passo, espero que esteja preparado(a) para aprender sobre o
fantástico mundo da programação orientado a objetos. Lembre-se que, a compreensão desse

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


19
paradigma será importante durante o curso e na sua vida profissional.

Bons estudos!

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


20
SUMÁRIO

AULA 1
Objetivos:

• Identificar a diferença entre os Paradigmas de Programação.


• Aplicar conceitos de abstração na modelagem de software
orientado a objetos.
• Distinguir os diversos conceitos sobre Linguagem de Programação.
• Praticar modelagem de Projetos Orientado a Objetos.
• Reconhecer a história da Programação Orientada a Objetos.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


21
UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS
2
AULA 1 – INTRODUÇÃO À PROGRAMAÇÃO
ORIENTADA A OBJETOS (POO)
CONTEXTUALIZANDO A APRENDIZAGEM

Prezado(a) Aluno(a), seja bem-vindo(a) a mais uma disciplina. Na abordagem da Aula 1, sobre
Programação Orientada a Objetos, você irá identificar situações voltadas para os conceitos
sobre linguagens de programação, paradigmas de programação, programação orientada
a objetos e prática de abstração do mundo real para o mundo computacional. É importante
para o êxito profissional, que nessa aula você procure ler, e reler esse material, se necessário,
bem como consultar os materiais indicados, tentar resolver os exercícios propostos e solicitar
ajuda ao seu professor sempre que surgirem dúvidas. Empenhe-se em seus estudos e lembre-se:
o seu sucesso só depende de você.

Preparado(a) para iniciar nossa caminhada pelo fantástico universo da Programação


Orientada a Objetos?

Vamos começar? Boa aula!

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


22
MAPA MENTAL PANORÂMICO
Para contextualizar e ajudá-lo a obter uma visão panorâmica dos conteúdos que você estudará
na Aula 1, bem como entender a inter-relação entre eles, é importante que se atente para o
Mapa Mental, apresentado a seguir:

INTRODUÇÃO À PROGRAMAÇÃO
ORIENTADA A OBJETOS (POO)

O QUE É LINGUAGEM DE
PROGRAMAÇÃO

HISTÓRICO DAS
LINGUAGENS DE
PROGRAMAÇÃO

LINGUAGEM DE BAIXO E
ALTO NÍVEL

NOMENCLATURAS DE PROGRAMAÇÃO
UMA LINGUAGEM DE IMPERATIVA
FALANDO SOBRE PROGRAMAÇÃO
LINGUAGEM DE PROGRAMAÇÃO
PROGRAMAÇÃO ORIENTADA A OBJETOS
PARADIGMAS DE
PROGRAMAÇÃO
PROGRAMAÇÃO
FUNCIONAL

PROGRAMAÇÃO
LÓGICA

LINGUAGEM
INTERPRETADA

CONSTRUÇÃO DE LINGUAGEM
PROGRAMAS COMPILADA

LINGUAGEM TRADUZIDA

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


23
HISTÓRICO DA
PROGRAMAÇÃO
ORIENTADA A OBJETOS

VANTAGENS DA
PROGRAMAÇÃO
ORIENTADA A OBJETOS

PENSANDO EM OBJETOS

OBJETOS, CLASSES
E MÉTODOS
(COMPORTAMENTO)

PRATICANDO A
IDENTIFICAÇÃO DE
CLASSES

ESTRATÉGIA PARA
CONCEITOS
PROJETO DE SOFTWARE
FUNDAMENTAIS
ORIENTADO A OBJETOS

OS PILARES DA
PROGRAMAÇÃO
ORIENTADA A OBJETOS

PRATICANDO A
IDENTIFICAÇÃO
CLASSES,
MÉTODOS,ATRIBUTOS E
RELACIONAMENTO. CLASSE

DIAGRAMA DE CLASSE ASSOCIAÇÃO ENTRE


CLASSES

DESENVOLVENDO
DIAGRAMA DE CLASSES

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


24
INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETOS (POO)
1- FALANDO SOBRE LINGUAGEM DE PROGRAMAÇÃO
Nessa aula, antes de abordamos o conteúdo relacionado à Programação Orientada a
Objetos (POO), vamos estudar alguns conceitos e termos que serão importantes para você
compreender sobre Linguagem de Programação. Esta leitura será importante para auxiliá-lo(a)
no seu aprendizado durante seus estudos.

1.1 - O QUE É LINGUAGEM DE PROGRAMAÇÃO?


Neste momento, você provavelmente já teve contato com alguma Linguagem de Programação
em outra(s) disciplina(s) do curso. Então você sabe que, para implementar um algoritmo em
um computador é necessário descrevê-lo de uma forma na qual o computador esteja apto a
executá-lo. Essa descrição é feita por intermédio de uma Linguagem de Programação.

A Linguagem de Programação pode ser considerada uma estrutura utilizada para comunicar
com equipamentos, sejam computadores, tablets ou processadores. Por exemplo, o conjunto
de instruções de um processador pode ser entendido como uma Linguagem de Programação.
Entretanto, utilizar comandos com base na arquitetura de processadores se torna inviável. E
para facilitar a nossa vida como desenvolvedores, existem linguagens de programação de alto
nível para auxiliar no desenvolvimento de software (GUDWIN,1997).

LEMBRE-SE!
Algoritmo pode considerado uma sequência de passos para obter um objetivo. Algoritmo
possui entrada, processamento e saída. Por exemplo, ao utiliza um telefone público
como um “orelhão” ou similar, as operações que devemos realizar estão especificadas
junto a esse telefone, sendo mais ou menos assim:
1-leve o fone ao ouvido;
2-insira seu cartão no orifício apropriado;
3-espere o sinal para discar;
4-assim que ouvir o sinal, disque o número desejado;
5-ao final da ligação, retorne o fone para a posição em que se encontrava;
6- retire seu cartão.
Esse conjunto de operações é o que se denomina algoritmo. Qualquer pessoa pode
executar essas operações, na ordem especificada, para fazer suas ligações telefônicas,
desde que possua um cartão específico e conheça o número para o qual quer telefonar
(EDELWEISS, 2014).

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


25
1.2 - HISTÓRICO DAS LINGUAGENS DE PROGRAMAÇÃO
As primeiras Linguagens de Programação começaram na década 1940 e as primeiras a serem
utilizadas foram as Linguagens de Máquina, por exemplo, assembly. A partir desta época,
surgiram várias Linguagens de Programação, algumas com tempo de vida e utilidade limitada.
Por outro lado, outras tiveram aplicações em vários domínios, a partir desta época (TUCKER,
2009).

Na década de 1950, começa a surgir a era das Linguagens de Ordem Mais Alta. A ideia era
tornar a tarefa de programação intuitiva para mais pessoas e criar linguagens para resolver
determinado grupos de problemas. As primeiras linguagens de ordem mais alta foram: Fortran,
Cobol, Algol e Lisp (TUCKER, 2009).

Nas últimas décadas, com o aumento do poder computacional, houve um aumento e


evolução das Linguagens de Programação para suprimir as demandas do mercado e auxiliar
na resolução de determinados domínios e problemas, como: inteligência artificial, software
Web entre outros. E atualmente, você pode escolher entre várias Linguagens de Programação
disponíveis para desenvolver softwares.

Fique atento, pois a Linguagem de Programação deve ser escolhida de acordo com domínio
do problema. Por exemplo, se for desenvolver um Jogo, existem linguagens que se adaptam
melhor a esse tipo de domínio.

Atualmente, é possível encontrar softwares que foram desenvolvidos utilizando linguagens


criadas há muitos anos. O problema é que, algumas dessas linguagens não evoluíram e
causam problemas para as empresas. Por Exemplo, alguns bancos ainda possuem softwares
desenvolvidos na Linguagem Cobol, e no mercado existem poucos profissionais com
conhecimento dessa linguagem.

A Linguagem de Programação Python nasceu com


a premissa de que pessoas comuns que não fossem
! FIQUE ATENTO! da área da computação pudessem programar.
Entretanto, para desenvolver um produto de software
ou um simples algoritmo é preciso conhecer os
conceitos de lógica para programação.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


26
1.3 - LINGUAGEM DE BAIXO E ALTO NÍVEL
As Linguagem de Programação podem ser classificadas em Baixo e Alto Nível. Linguagens de
Baixo Nível são difíceis de serem utilizadas pelo ser humano, pois utilizam comandos e termos de
difícil compreensão. Por outro lado, as Linguagens de Alto Nível proporcionam maior interação
com o usuário e podem ser consideradas de fácil compreensão. Como Linguagem de Alto
Nível, podemos citar as linguagens Java e C# e Baixo Nível a Linguagem Assembly. A Figura
1 mostra o exemplo de código na Linguagem C e o mesmo código na Linguagem Assembly.

Figura 1 - Código em C e Assembly

Fonte: Elaborada pelo Autor.

importante

Nas próximas aulas, você terá a oportunidade de estudar


conteúdos relacionados à Linguagem C#, pois o principal
objetivo dessa aula é fortalecer os conhecimentos teóricos que
são base para o desenvolvimento de softwares, principalmente
no Paradigma Orientado a Objetos.

1.4 - NOMENCLATURAS DE UMA LINGUAGEM DE PROGRAMAÇÃO


Ao analisar uma Linguagem de Programação, você pode se deparar com um vocabulário
básico que pode auxiliá-lo a entender sua estrutura. Alguns dos conceitos dessas categorias,
descritos a seguir, foram retirados da linguística e da matemática (TUCKER, 2009):

Sintaxe: A sintaxe de uma linguagem descreve o que constitui um programa estruturalmente


correto. A ideia principal da Sintaxe é definir se o código escrito pelo programador está de
acordo com as regras da linguagem de uma programação utilizada. Para validar essas regras,
o compilador e/ou interpretador de código analisam se o código está de acordo com essas

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


27
regras (TUCKER, 2009).

Nomes e Tipos: O vocabulário de uma linguagem inclui um conjunto de regras cuidadosamente


projetado para nomear entidades, variáveis, funções, métodos, classes, parâmetros e outras
estruturas da linguagem. Os tipos de uma linguagem denotam os tipos de valores que os
programas podem manipular: tipos simples, tipos estruturados e tipos mais complexos. Entre os
tipos simples estão valores inteiros, números decimais, caracteres e boleanos. Tipos estruturados
incluem strings de caracteres, listas, árvores e tabelas hash (TUCKER, 2009).

Semântica: O significado de um programa é definido pela sua Semântica, ou seja, quando um


programa é executado, o efeito de cada comando sobre os valores das variáveis e outros itens
do programa é dado pela Semântica da linguagem (TUCKER, 2009).

O interessante é que, ao desenvolver um programa, o erro de semântica pode ser descoberto


apenas durante a execução do software. Por exemplo, imagine um código que deveria
calcular a soma de A+B, porém, durante o desenvolvimento, foi calculado subtração de A-B.
O código possui a sintaxe correta, mas possui um erro de semântica.

Ao escrever um texto, você escreve: estudar


adoro Programação Orientada a Objetos.
Perceba que a sintaxe das palavras está
correta, pois todas as palavras estão
EXEMPLIFICANDO escritas corretamente, porém, ao analisar
a Semântica da frase, você percebe que
existe um erro, pois o correto seria: adoro
estudar Programação Orientada a Objetos.

1.5 - PARADIGMAS DE PROGRAMAÇÃO


Paradigma pode ser considerado um padrão de pensamento que guia um conjunto de
atividades relacionadas. E na Programação, um Paradigma pode ser considerado um padrão
de resolução de problemas que se relaciona a um determinado gênero de Programas de
Linguagem. Além disso, Paradigmas podem definir uma estrutura para um tipo específico
de problema a ser resolvido (TUCKER, 2009). Os principais paradigmas são: Programação
Imperativa, Programação Orientada a Objetos, Programação Funcional e Programação
Lógica. O interessante é que algumas Linguagens de Programação foram projetadas para
suportar mais de um Paradigma de Programação. Por exemplo, C++ é uma Linguagem
Imperativa e Orientada a Objetos.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


28
1.5.1 - PROGRAMAÇÃO IMPERATIVA (ESTRUTURADA)
É o Paradigma mais antigo, já que está fundamentado no
modelo computacional básico de “von Neumann”. Nesse
modelo, o programa contém uma série de comandos para GLOSSÁRIO
executar cálculos, atribuir valores às variáveis, obter entrada
e produzir saídas (TUCKER, 2009). VON NEUMANN

Na Linguagem Imperativa, os comandos são executados Arquitetura Computacional


normalmente na ordem em que aparecem na memória, que tem como premissa
embora comandos de ramificações condicionais e a possibilidade de uma
incondicionais possam interromper esse fluxo normal de máquina digital armazenar
execução. Devido ao seu uso extensivo de ramificações, seus programas no mesmo
os primeiros Programas Imperativos eram, muitas vezes, espaço de memória de
modelados com o auxílio de um diagrama de fluxo. As dados. A Figura 3 representa
principais Linguagens que suportam apenas este Paradigma a máquina de Vonn
são: Cobol, Fortran, C, Ada e Perl (TUCKER, 2009). A Figura 2 Neuman. Perceba que o
mostra um exemplo de Programa no Paradigma Imperativo programa e as variáveis são
(estrutura) desenvolvido na Linguagem C. alocados no mesmo local
Figura 2 - Exemplo programação funcional (TUCKER, 2009).

Fonte: Fonte: Elaborada pelo Autor.

Figura 3. Máquina de Von Neumann

Fonte: TUCKER (2009)

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


29
1.5.2 - PROGRAMAÇÃO ORIENTADA A OBJETOS
Neste Paradigma, a ideia central é pensar em um software com estruturas idênticas ao mundo
real. Nesta estrutura, tudo é tratado como um conjunto de objetos que podem interagir entre
si por meio de troca de mensagem entre os objetos. Essa característica ajuda a distinguir a
Programação Orientada a Objetos da Imperativa. Algumas Linguagens Orientadas a Objetos
são: Smalltalk, Java e C# (TUCKER, 2009). A Figura 4 mostra um exemplo de Programa Orientado
a Objetos, neste exemplo são apresentadas duas classes.

Figura 4 - Exemplo de Programa Orientado a Objetos

Fonte: Elaborada pelo Autor.

1.5.3 - PROGRAMAÇÃO FUNCIONAL


A ideia central desse Paradigma é tratar os problemas como funções matemáticas (TUCKER,
2009). Por exemplo, a fórmula “X = X + 50”, não faz sentido na programação funcional ou na
matemática. Por outro lado, essa fórmula pode ser utilizada no Paradigma Procedimental e
Orientado a Objetos (TUCKER, 2009). Principais Linguagens Funcionais: LIsp, Scheme, Haskell
e ML. Resumindo, a Programação Funcional trabalha baseada nas funções matemáticas. A
Figura 5 mostra um exemplo de código utilizando Programação Funcional.

Figura 5 - Exemplo Programação Funcional

Fonte: (UFRN,2019)

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


30
1.5.4 - PROGRAMAÇÃO LÓGICA
Esse Paradigma permite que você modele um programa declarando qual resultado o programa
deve obter, em vez de como ele deve ser obtido. A principal Linguagem Lógica é o Prolog. A
Figura 6 mostra um exemplo de programação lógica.

Figura 6 - Exemplo Programação Lógica

Fonte: (SOARES, 2019)

1.6 - CONSTRUÇÃO DOS PROGRAMAS


Para você executar o código de um programa que foi produzido é necessário que seja feita
a conversão para uma linguagem que seja compreendida pelo computador (linguagem
de máquina). Existem três métodos de conversão: Linguagem Compilada, Interpretada e
Traduzida.

1.6.1 - LINGUAGEM INTERPRETADA


Nesse tipo, o código fonte é interpretado por um interpretador (Figura 7) e cada instrução
é convertida por etapas até que todo a conversão seja realizada. Exemplos de linguagem:
Javascript, PHP, Lua (MANZANO,2014).

Figura 7 - Linguagem Interpretada

Fonte: (USP,2019)

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


31
Vantagens:

- Correções podem ser realizadas com menor tempo.

- Consome menos memória.

Desvantagens:

- Execução mais lenta, pois precisa interpretar o código fonte em tempo de execução,
ou seja, quando o software estiver em uso.

- Necessidade do código original (código fonte) para que ele seja executado.

1.6.2 - LINGUAGEM COMPILADA


Linguagens que utilizam este conceito são compiladas através de um compilador que
transforma o código fonte que foi desenvolvido pelo programador em código executável.
Esse código executável é um arquivo binário (linguagem de máquina) que será executado
diretamente pela máquina. A estrutura pode ser observada de acordo com a Figura 8. As
linguagens C e C++ são exemplos que utilizam esse conceito (MANZANO,2014).

Figura 8 - Linguagem Compilada

Fonte: Elaborada pelo Autor.

Vantagens:

- Tem uma melhor performance relacionada ao tempo de execução, pois executa diretamente
no nível da máquina.

Desvantagem:

- A manutenção só é possível a partir do código-fonte.

- O código executável gerado somente poderá ser executado em máquinas de mesma


arquitetura.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


32
1.6.3 - LINGUAGEM TRADUZIDA
A Linguagem com esse método, trabalha de forma intermediária entre as Linguagens
Compiladas e Interpretadas (Figura 9). Neste caso, é gerado um código intermediário, mas
que não exige muito espaço e para ser executada, é necessária uma máquina virtual. Alguns
autores denominam a linguagem com este método de Pré-compilada ou Híbrida. Exemplos de
linguagens são: Java e C# (MANZANO,2014).

Figura 9 - Linguagem Traduzida

Fonte: TUCKER, 2009).

Vantagens:

- Independente da arquitetura que fará a execução


final. Entretanto, é necessária uma máquina virtual GLOSSÁRIO
(Framework) entre o software e a arquitetura.
FRAMEWORK
Desvantagens:

Necessidade de um interpretador específico na máquina Centralização (interseção)


do usuário final que fará a interpretação. Esse interpretador das funcionalidades comuns
pode ser a máquina virtual (Framework). entre várias linguagens.
Disponibiliza estruturas pré-
definidas para que sejam
utilizadas pela Linguagem
LEMBRE-SE! de Programação.

Até o momento, abordamos conceitos importantes


para te auxiliar a compreender sobre paradigmas,
estruturas e outros conceitos relacionados à Linguagem
de Programação. A partir de agora, vamos iniciar nossos
estudos relacionados à Programação Orientada a
Objetos.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


33
2 - PROGRAMAÇÃO ORIENTADA A OBJETOS
Como estudamos até o momento, as Linguagens de Programação podem ser divididas em
Paradigmas. A partir desse tópico da disciplina, vamos abordar sobre a Programação Orientada
a Objetos. E para auxiliá-lo no seu aprendizado, vamos estudar os conceitos com exemplos
do mundo real para que você possa praticar a abstração que é um dos principais pilares da
Programação Orientada a Objetos.

2.1 - HISTÓRICO DA PROGRAMAÇÃO ORIENTADA A OBJETOS


Para falar sobre o histórico do Paradigma de Programação Orientada a Objetos é preciso
falar sobre parte da história da programação. No final dos anos 1960 e o início dos anos 1970
houve uma análise intensa, iniciada em grande parte pelo movimento da Programação
Estruturada (Imperativa) tanto do processo de desenvolvimento de software, quanto do
projeto de Linguagem de Programação. Nessa época, o custo com o desenvolvimento de
programa aumentava, e por outro lado, o custo com o hardware diminuía. Além disso, os
computadores resolviam problemas maiores e mais complexos (SEBESTA,2018). Na mesma
época, os computadores começaram a ser utilizados com mais intensidade pelas empresas e
existiam várias pesquisas para desenvolver Novos Paradigmas que pudessem acompanhar as
mudanças e melhorar o rendimento no desenvolvimento de software.

Na década de 1980, iniciou-se a grande evolução na Programação Orientada a Objetos.


Nessa década, o Paradigma se desenvolveu com uma linguagem que oferecia suporte para
seus conceitos: Smalltalk. Entretanto, essa linguagem não foi amplamente utilizada no mercado
(SEBESTA,2018).

Após este período inicial e com passar do tempo, ficou mais fácil identificar as práticas que
funcionavam na Programação Orientada a Objetos e surgiram várias linguagens com suporte
a este paradigma: Java, C++, C# entre outras. Atualmente, esse Paradigma é o mais utilizado
no mercado.

2.2 - VANTAGENS DA PROGRAMAÇÃO ORIENTADA A OBJETOS


Antes de escolher o Paradigma de Programação, você precisa analisar suas vantagens e
desvantagens. A seguir, são apresentadas algumas vantagens da Programação Orientada a
Objetos:

Reutilização de código: ao utilizar o Paradigma Orientado a Objetos existem várias formas de


evitar a duplicação de código fonte para proporcionar a reutilização de código. Por exemplo,
ao criar uma Classe A que contenha um conjunto de algoritmos é possível reutilizá-la em todo

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


34
o projeto.

Testabilidade: uma das fases mais importantes do desenvolvimento de software é a fase de


teste. E utilizar o Paradigma Orientado a Objetos pode facilitar os testes, principalmente nos
testes unitários.

De acordo com pesquisas acadêmicas e de mercado,


! FIQUE ATENTO! 40% do tempo de produção de um produto de
software é utilizado na etapa de testes.

Independência: cada objeto executa funções específicas, independente de outro objeto.


Consequentemente, cada classe pode ser mudada de uma forma amplamente autônoma.

Manutenabilidade: geralmente, os softwares desenvolvidos precisam de manutenção. A


Programação Orientada a Objetos, quando utilizada corretamente, pode facilitar futuras
manutenções no software.

2.3 - PENSANDO EM OBJETOS


A partir de agora, vamos pensar e estudar sobre os principais itens da Programação Orientada
a Objetos. Um dos principais problemas relacionados ao Paradigma Orientado a Objetos está
relacionado a fase de abstração, que resumidamente é transformar um problema ou domínio
do mundo real no mundo computacional. E para te ajudar a pensar “Orientado a Objetos”,
abordaremos a seguir, alguns temas do mundo real para te auxiliar no aprendizado.

Seu guarda roupa

Imagine que você precisa organizar o seu guarda-roupa. Para isso, é necessário considerar as
roupas como o principal item que você terá que lidar. Então, o primeiro passo será organizar
as suas roupas. Entretanto, se você tentar colocar todos os tipos de objetos da classe roupa
no mesmo local, ainda não será o suficiente para deixar seu guarda-roupa organizado (FELIX,
2016).

A partir deste momento, você percebe que precisa de outra estratégia e decide encontrar
classes mais específicas para organizar seu guarda-roupa, pois você não quer guardar camisas
na mesma gaveta onde estão as calças. Então, você percebe que classificar por classes de
tipos de peças seria mais interessante para organizar o seu guarda-roupa, pois ao organizar por
tipo de peças, seria mais fácil de encontrar a camiseta da sua banda preferida (FELIX, 2016).

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


35
É possível analisar diversas ações relacionadas com esse contexto. Note que nesse momento
citamos classe e objeto que são os principais fundamentos da Programação Orientada a
Objetos. Por exemplo, aquela camiseta da sua banda preferida é um objeto da classe camiseta.

Ambiente Virtual de Aprendizado - AVA

No exemplo anterior, abordamos um tema para você pensar em objetos concretos relacionados
ao mundo real. Entretanto, objetos também podem ser abstratos, por exemplo, essa disciplina
que você está cursando é um objeto abstrato da classe disciplina.

Durante a utilização do AVA (Ambiente Virtual de Aprendizado) do UNIARAXÁ, você consegue


perceber que a estrutura está organizada em telas relacionadas ao tipo ou grupo de classes.
Ao entrar no fórum, você vai encontrar todos os fóruns abertos no mesmo local. Na tela de
consulta de atividades, você consegue ver a nota de todos os trabalhos da disciplina.

Assim, como no exemplo da organização do guarda-roupa, percebemos que a classificação


dos objetos dentro do contexto do AVA, auxiliou na organização dos objetos por tipos ou grupos
de classes. Por exemplo, aquela postagem que você fez no fórum de dúvidas é um objeto da
classe fórum. O vídeo da aula 01 é um objeto da classe vídeo.

2.4 - OBJETOS, CLASSES, ATRIBUTOS E MÉTODOS (COMPORTAMENTO)


Objetos podem ser categorizados e uma classe descreve, de uma maneira abstrata, todos
os objetos de um tipo em particular. Por exemplo, considere que você deseja modelar uma
simulação de tráfego. Nesse momento você possui alguns objetos do tipo carro. Então, nesse
contexto, carro seria uma classe ou um objeto? Algumas perguntas podem nos ajudar a
responder:

De que cor é o carro? Que velocidade ele pode alcançar? Quantas pessoas podem ocupar
este carro?

Você notará que não podemos responder a essas perguntas, a não ser que seja um carro
específico. A razão é que a palavra “carro”, nesse contexto, refere-se a classe carro, pois
estamos falando carro em geral e não um carro específico. Agora, se você relatar que o seu
carro está no estacionamento, podemos responder às perguntas acima, pois você sabe a cor,
a velocidade máxima e a capacidade de pessoas. Nesse momento, você pode definir que o
seu carro é um objeto da classe carro. Resumindo: objetos correspondem a elementos da vida
real e classes agrupam esses objetos.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


36
Figura 10 - Exemplo de Classe e Objeto - Aluno

Fonte: Elaborada pelo autor.

Você pode analisar outro exemplo representado pela Figura 10, que representa uma classe
aluno e os alunos (objetos) Júlia e Pedro que derivam dessa classe. Nesse momento, é possível
notar que existem os atributos Nome e Idade que são comuns para os objetos da classe aluno.

Figura 11 - Exemplo de Classe e Objeto - Livro

Fonte: Elaborada pelo autor.

No exemplo da Figura 11, temos uma classe livro e os objetos livro da Constituição Brasileira
e Código Da Vinci. Provavelmente, nesse momento você está pensando: mas existem várias
cópias do livro Código Da Vinci, então, ele pode ser uma Classe? Porém, note que, mesmo
que existam várias cópias do livro, os dados dos seus atributos (Título e data de publicação)
serão os mesmos, então, são o mesmo objeto. Mas, se for lançada uma segunda edição do
livro Código Da Vinci, esse novo lançamento será um novo objeto da classe Livro, pois possui a
data de publicação diferente.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


37
Figura 12 - Exemplo de Classe e Objeto - Disciplina

Fonte: Elaborada pelo autor

Na Figura 12, temos um exemplo de classe de objetos abstratos. As disciplinas que você está
cursando são objetos da classe disciplina. Ao adicionar a disciplina Banco de Dados I, ela será
um objeto da classe disciplina.

Durante os exemplos de classe e objetos comentamos sobre atributos que podem ser
considerados como propriedades das classes e que podem ser preenchidos pelos objetos. Por
exemplo, toda classe disciplina pode ter nome e data de cadastro, então estes dois itens são
chamados de atributos da classe disciplina.

Além de atributos, uma classe pode conter comportamentos (Métodos), que é uma ação
executada por um objeto quando recebe uma mensagem ou em resposta a uma mudança
de estado, ou seja, é algo que o objeto faz. Ao analisar o exemplo da classe Aluno (Figura 5),
seria possível citar alguns comportamentos da vida real, como: andar, estudar. E ao analisar a
classe disciplina (Figura 6) é possível citar alguns comportamentos do mundo computacional
que fazem parte do ambiente do AVA: SalvarDados, PesquisarDados e ExcluirDisciplina.

importante

As formas de utilizar atributos e comportamento de classes


em uma determinada Linguagem de Programação serão
abordadas nas próximas aulas dessa disciplina.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


38
2.5 - PRATICANDO A IDENTIFICAÇÃO DE CLASSES
Chegou a hora de praticar!!!! Leia atentamente os exercícios abaixo e tente resolvê-los. As
respostas estão no final desta aula.

Exercício 1 - Consultório - Identifique as possíveis classes do cenário descrito a


seguir.
Um consultório médico solicitou que seja feito um software para controlar o
agendamento e consulta dos seus pacientes.
- Será necessário controlar o agendamento de consultas do paciente.
- Cadastrar os dados pessoais do paciente.
- Cadastrar o plano de saúde que o consultório trabalha.
- E a cada consulta, será necessário selecionar um cliente e excluir a consulta do
controle de agendamento.

Exercício 2 - Empresa de Festa - Identifique as possíveis classes do cenário descrito


a seguir.
Rafaela possui vários temas de festas infantis para aluguel. Ela precisa controlar
os aluguéis e para isso quer um software que permita cadastrar: o nome e o
telefone do cliente, o endereço completo da festa, o tema escolhido, a data da
festa, a hora de início e término da festa. Além disso, para alguns clientes antigos,
Rafaela oferece descontos. Sendo assim, é preciso saber o valor real cobrado
num determinado aluguel. Para cada tema, é preciso controlar: a lista de itens
que compõem o tema (ex.: castelo, boneca da cinderela, bruxa, etc), o valor do
aluguel e cor da toalha da mesa que deve ser usada com o tema (MELO,2006).

2.6 - ESTRATÉGIAS PARA PROJETO DE SOFTWARE ORIENTADO A OBJETOS


Você está desenvolvendo um Programa Orientado a Objetos para implementar um software
para uma loja de venda de perfumes. Sua estrutura seria composta por algumas classes, entre
elas, os itens comprados, os dados do cliente, caixa e dados da venda.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


39
Figura 13 - Exemplo de classe

Fonte: adaptada de (SINTES, 2002)

A Figura 13 representa uma estrutura de relacionamento entre classes que mostra o cenário de
vendas. Perceba que, esses objetos interagem uns com os outros para orientar a estrutura do
programa. Por exemplo, quando for fechar a venda, o objeto caixa precisa analisar o preço
de todos os itens vendidos.

Definir e analisar como os objetos se relacionam é um requisito muito importante dentro da


Programação Orientada a Objetos. Geralmente, os objetos podem se relacionar de duas
maneiras. A primeira forma é por meio de mensagens, pois você pode solicitar que uma
Classe A passe mensagem para uma Classe B, por meio da utilização do comportamento da
das Classes (Métodos). A segunda forma de comunicação, seria a possibilidade da Classe A
conter objetos da Classe B, isto é chamado de agregação (SINTES, 2002). A Figura 7 mostra que
entre as classes existem relacionamentos, por exemplo, entre Venda e Itens Vendidos há um
relacionamento de agregação.

Definir o software analisando as classes é uma maneira


de ver o software na forma estrutural interna. Os

! FIQUE ATENTO! objetos podem te ajudar a compreender o nível de


responsabilidade de cada objeto. Isso pode auxiliá-lo
a pensar na estrutura de software orientado a objetos
como objetos do mundo real (SINTES,2002).

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


40
2.7 - OS PILARES DA PROGRAMAÇÃO ORIENTADA A OBJETO
Figura 14 - Pilares de POO

Fonte: (ALVES,2019).

A Programação Orientada a Objetos possui quatro


pilares (Figura 8): polimorfismo, herança, abstração e
encapsulamento, que são apresentados a seguir. GLOSSÁRIO
Abstração: como discutimos em outros tópicos, abstração é
a parte mais difícil da Programação Orientada a Objetos, UML

pois nessa fase é realizada a transformação do mundo real


Unified Modeling
no mundo computacional, que pode ser modelado com
Language (Linguagem de
auxílio do diagrama de classe (UML).
Modelagem Unificada):
Encapsulamento: Como apresentado na Figura 13, uma linguagem padrão para a
classe pode relacionar-se com uma ou mais classes. Então, elaboração da arquitetura
imagine que exista um atributo ou método que seja utilizado de projetos de software.
somente pela classe à qual ele pertence. Então, por motivo Ela pode ser empregada
de segurança e outros fatores, seria importante “esconder” para visualização,
esse método. É neste cenário que o Encapsulamento pode especificação, construção e
auxiliar, pois é possível “esconder” métodos e atributos de documentação de artefatos
uma classe para que não sejam acessados por classes de software.
externas.

Herança: posso ter uma classe aluno, mas aluno é algo muito generalista, então, é possível criar
classes que sejam filhas (subclasses) da classe Aluno, por exemplo, Graduação e Mestrado
(Figura 9) herda da classe Aluno. Então, na classe Aluno são adicionados atributos e métodos
(comportamentos) que são comuns a qualquer aluno. E nas classes filhas (subclasse) mestrado
e graduação, são adicionado somente o que é especialidade dessa classe. Geralmente, a
herança é chamada de Generalização e Especialização.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


41
Figura 15 - Exemplo de Herança

Fonte: Elaborada pelo autor.

Polimorfismo: é a capacidade de que métodos de classe que possuem um relacionamento


de herança com outra classe possam ter comportamento com características próprias. No
exemplo citado acima (Figura 15), temos três classes: Aluno que pode ser chamada de classe
pai (superclasse) e Graduação e Mestrado que são classes filhas (subclasse). Então, imagine
um comportamento de calcular a mensalidade. Concorda que cada classe pode possuir
características distintas? Ou seja, a forma de calcular a Mensalidade do Mestrado por ser
diferente da Classe Graduação.

importante

A implementação dos conceitos de herança, polimorfismo


e encapsulamento serão abordados com mais detalhe nas
próximas aulas. Neste momento, estamos abordando apenas
os conceitos dos pilares da Programação Orientada a Objetos.

2.8 - PRATICANDO A IDENTIFICAÇÃO CLASSES, MÉTODOS, ATRIBUTOS E RELACIONAMENTO


Neste momento, vamos praticar a identificação de classes, atributos, métodos e relacionamento
entre classes de cenários reais. O objetivo é praticar a abstração, que pode ser considerada
a parte mais complexa da Programação Orientada a Objetos, que resume em transformar o
mundo real em mundo computacional, por meio da Programação Orientada a Objetos. As
respostas dos exercícios estão no final da aula.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


42
Exercício 3 - Conta de Luz - Identifique quais classes, atributos e métodos existem
neste cenário.
Gabriel controla sua conta de luz utilizando uma planilha eletrônica. Para cada
conta de luz, ele cadastra: a data que foi realizada a leitura no relógio, o número
da leitura, a quantidade de KW gastos no mês, o valor a pagar pela conta, a data
e a média de consumo. Mensalmente, são realizadas as seguintes pesquisas: a)
verificação do mês de menor consumo; b) verificação do mês de maior consumo
(MELO,2006). A Figura 16 representa a planilha utilizada por Gabriel.
Figura 16 - Planilha de Controle de Gastos

Fonte: (MELO,2006)

Exercício 4 - Horários de Remédios - Identifique quais classes, atributos e métodos


existem neste cenário. Além disso, tente identificar os relacionamentos entre as
classes.
Imagine que você foi contratado para desenvolver um software para controle de
horários para um paciente tomar seus remédios.
Para cada remédio, cadastra-se: o nome de quem vai tomar o remédio, a data
de início, a quantidade de dias que foi prescrita pelo médico, a quantidade de
vezes ao dia, a dosagem e o nome do remédio.
Ao cadastrar o remédio, a aplicação sugere todos os horários possíveis para tomar
o remédio. O usuário escolhe o melhor horário e a aplicação avisa até quando
o remédio deve ser tomado e prepara uma planilha de controle de horários. O
usuário, no início do dia, seleciona a opção de planilha de horários de remédios
do dia (MELO,2006).

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


43
2.9 - DIAGRAMA DE CLASSE
Para auxiliar na Modelagem de Software Orientado a Objetos você pode utilizar o Diagrama
Classe que faz parte dos diagramas da UML. Neste tópico, vamos fazer um resumo sobre
Diagrama de Classes para auxiliar no aprendizado. Contudo, neste momento, vamos abordar
apenas os principais elementos do Diagrama.

2.9.1 - CLASSE
A Figura 17 representa um exemplo de Diagrama de Classe com vários elementos da notação
de tal Diagrama. Vamos identificar alguns elementos, por exemplo: ao entrar no fórum você
possui a opção para criar um tópico no fórum e quando acessar o AVA, você é uma pessoa,
mas do tipo Aluno e não Professor. É visível a similaridade desse diagrama com mundo real, não
é verdade?

Figura 17 - Exemplo e Diagrama de Classe

Fonte: Elaborada pelo autor.

O principal elemento do Diagrama de Classe é a classe. A Figura 18 representa uma classe e


como seria sua representação no código ao utilizar a linguagem C#. Basicamente, o Diagrama
é dividido em três partes: a primeira representa o nome da classe, na segunda são adicionados
os atributos da classe e na terceira os métodos (comportamentos) da classe (BOOCK,2006).

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


44
Figura 18 - Exemplo de Classe - Diagrama e Código C#

Fonte: Elaborada pelo autor.

Outra propriedade importante no Diagrama de Classe é a definição de visibilidade do métodos


e atributos:

+ public (público): indica que o elemento da classe pode ser utilizado livremente por outras
classes do mesmo ou de outro pacote. Na Figura 11, a classe Pessoa tem acesso a classe
Tópico Fórum, e como os métodos Postar(), Enviar Email() e Excluir() são públicos (+), a classe
Pessoa pode utilizar estes métodos.

# protected (protegido): indica que existe proteção e os detalhes da execução da classe


podem ser utilizados apenas pela própria classe e suas classes filhas(subclasse). Conforme a
Figura 11, os atributos Código e Nome da classe Pessoa são protegidos (#) então, somente as
classes filhas (subclasses) Aluno e Professor terão acesso a esses atributos.

~ package (pacote): indica que os métodos e atributos da classe podem ser utilizados
livremente por outras classes pertencentes ao mesmo pacote. Este tipo de visibilidade é utilizado
exclusivamente na linguagem JAVA. O objetivo é separar a visibilidade de acordo com um
grupo de classes. Por exemplo, o software do UNIARAXÁ pode ser separado por pacotes de
classes de acordo com setores: acadêmico e financeiro.

- private (privado): indica que os métodos e atributos podem ser manipulados apenas pela
própria classe. Perceba que a classe Aluno possui um atributo RA com visibilidade protegida (-).
Então, nenhuma classe externa terá acesso a esse atributo.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


45
importante

Na Linguagem C# existem outros tipos de visibilidades que


serão abordados nas próximas aulas.

2.9.2- ASSOCIAÇÃO ENTRE CLASSES


Como já estudamos nesta aula, as classes precisam se relacionar para executar determinadas
funcionalidades para as quais foram construídas. Dentro do diagrama de classe, é possível
definir o relacionamento entre essas classes por meio da associação. Os principais tipos de
associação serão apresentados a seguir:

Associação binária

Este tipo de associação acontece entre duas classes. Os exemplos abaixo (Figura 19)
representam alguns tipos de relacionamento do tipo binário. No primeiro exemplo, é utilizada
uma linha simples para definir o relacionamento entre as classes. No segundo exemplo, é
utilizada uma seta para deixar claro quem possui acesso a qual classe. Nesse exemplo, a
classe Funcionário aponta para a classe Dependente, isso define que a classe Funcionário terá
acesso ao conteúdo da classe Dependente, porém a classe dependente não terá acesso ao
conteúdo da classe Funcionário. No último exemplo, o triângulo e o verbo definem o sentido
da leitura do diagrama, neste exemplo, a leitura correta seria: “dependente, depende do
funcionário” (BOOCK,2006).

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


46
Figura 19 - Exemplos de associação binária

Fonte: Elaborada pelo autor

Antes de falar dos outros tipos de associação (relacionamento), vamos aprender sobre o grau
de multiplicidade entre as classes. Note que no diagrama (Figura 13), além do relacionamento,
é possível definir o grau de multiplicidade. Por exemplo, o Dependente pode depender apenas
de um Funcionário (1), por outro lado, o Funcionário pode ter nenhum ou vários dependentes
(*) (BOOCK,2006). A Figura 20 representa os tipos de grau de multiplicidade que podem ser
utilizados.

Figura 20- Exemplos de multiplicidade

Fonte: Adaptado de (BOOCK,2006)

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


47
Associação unária

Neste tipo de relacionamento, a classe relaciona-se com ela mesma, por exemplo, um
funcionário pode chefiar um ou mais funcionários (Figura 21). Este tipo de relação, na maioria
das situações, pode ser substituído por um relacionamento binário, neste exemplo, poderia
existir uma classe Funcionário e outra classe Chefia (BOOCK,2006).

Figura 21- Associação Unária

Fonte: Elaborada pelo autor.

Associação de agregação

Agregação é um tipo especial de associação que tenta demonstrar que as informações de


um objeto (chamado objeto-todo) precisam ser complementadas pelas informações contidas
em um ou mais objetos de outra classe (chamados objeto-parte). No exemplo (Figura 22),
para que um time exista é necessário que possua jogadores. Note que, existe um losango no
relacionamento, e este símbolo define este tipo relacionamento (BOOCK,2006).

Figura 22- Agregação

Fonte: Elaborada pelo autor

Composição

Este tipo de relacionamento é idêntico à Agregação. Porém, a composição, além de deixar


claro que um objeto todo precisa do objeto parte, demonstra também que o objeto parte
pode pertencer apenas a um objeto todo. No exemplo (Figura 23), a classe Edição precisa da

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


48
classe Revista, além disso, a agregação que é representada pelo losango preenchido, mostra
que uma revista pode pertencer apenas a uma edição (BOOCK,2006).

Figura 23 - Composição

Fonte: adaptada de (BOOCK,2006)

Generalização

Este tipo de associação é utilizado para identificar classes ancestrais, chamadas de gerais e
classe herdeiras, chamadas de especializadas. Este tipo de relacionamento permite também
demonstrar a ocorrência de Métodos Polimórficos. No exemplo (Figura 24), a classe Pessoa
possui tudo o que é comum para as classes Aluno e Professor. Nas classes Aluno e Professor, é
adicionado somente aquilo que é especialidade delas (BOOCK,2006).

Figura 24- Herança (Generalização e Especialização)

Fonte: Elaborada pelo autor

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


49
Classe Associativa

Utilizada quando ocorrem associações que possuem relacionamentos de muitos para muitos
(*). No exemplo (Figura 25), existe um relacionamento de muitos para muitos entre Ator e Filme,
então surge a necessidade de criar uma terceira classe para detalhar o relacionamento. A
classe Atua foi criada para controlar o papel que o ator terá no Filme (BOOCK,2006).

Figura 25- Classe associativa

Fonte: Elaborada pelo autor

Dependência

A ideia é definir que uma classe possui uma dependência de existência de outra classe. No
exemplo (Figura 26), a classe item Carrinho dependente da existência da classe Carrinho
Compra (BOOCK,2006). Atenção, pois esse tipo de relacionamento não costuma ser utilizado.

Figura 26- Dependência

Fonte: Elaborada pelo autor

Apresentamos nesse tópico, um resumo sobre Diagrama de Classes. Contudo, existem outros
elementos que não foram abordados neste momento e serão apresentados nas próximas aulas
da disciplina.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


50
DICA DO AUTOR
O aprendizado sobre Diagrama de Classe é indispensável para compreender
a Programação Orientada a Objetos. Nas próximas aulas, teremos outros
exemplos em conjunto com a representação da sua estrutura na Linguagem de
Programação.

2.9.3 - DESENVOLVENDO DIAGRAMA DE CLASSES


Vamos praticar. Desenvolva o Diagrama de Classes dos cenários a seguir. Neste momento,
não se preocupe com a visibilidade dos atributos e métodos (encapsulamento), tente apenas
construir o Diagrama de Classe. As respostas dos exercícios estão disponíveis no final da aula.

DICA DO AUTOR
Existem várias ferramentas para criação de Diagrama de Classe. O Astah é uma
dessas ferramentas. Faça o download da versão gratuita, clicando aqui.

Exercício 5 - Controle de Edifício


Uma administradora de condomínios deseja construir um sistema para o
gerenciamento de edifícios. Para cada edifício, é necessário armazenar o nome,
o endereço, a data de construção e a data da última vistoria. Cada edifício possui
vários apartamentos, cada apartamento tem um número de área (m2).

Exercício 6 - Funcionários
Uma empresa precisa de um sistema para armazenar os dados dos funcionários
e dependentes. Os dados dos funcionários a serem armazenado são o nome, o
CPF e a data de nascimento. Para o dependente, deseja-se armazenar o nome e
a data de nascimento. Além disso, a empresa determinou que cada funcionário
pode ter no máximo cinco dependentes.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


51
CONECTANDO

Nessa aula, foi apresentada uma abordagem inicial sobre Programação Orientada a
Objetos. Discutimos sobre Diagrama de Classe, que faz parte da UML (Linguagem de
Modelagem Unificada), conteúdo amplamente discutido em outras disciplinas desse
curso.

aUTOaVALIAÇÃO
Após essa aula, você é capaz de identificar a diferença entre os Paradigmas
de Programação? Sabe aplicar conceitos de abstração na modelagem de
software orientado a objetos? Consegue distinguir os diversos conceitos
sobre Linguagem de Programação? Caso você consiga responder essas
questões, parabéns! Você atingiu os objetivos específicos da Aula 1! Caso
tenha dificuldades para responder algumas delas, aproveite para reler o
conteúdo da aula, acessar o UNIARAXÁ Virtual e interagir com seus colegas,
tutor (a) e professor (a). Você não está sozinho nessa caminhada! Conte
conosco!

RECAPITULANDO
Caro(a) Aluno(a), chegamos ao fim da nossa aula. Esperamos que tenha compreendido os
conceitos da Programação Orientada a Objetos e tenha resolvido os exercícios disponibilizados
nessa aula.

Inicialmente, estudamos os conceitos sobre Linguagem de Programação e Paradigmas de


Programação, com o objetivo de compreender as estruturas existentes relacionadas ao
desenvolvimento de software. Em seguida, abordamos os conceitos e história da Programação
Orientada a Objetos para ajudá-lo a compreender a importância deste Paradigma no cenário
atual. Por fim, foram propostos atividades e tópicos para auxiliá-lo(a) a compreender e identificar

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


52
os principais elementos presentes na Programação Orientada a Objetos.

Muito bem! Em nossa próxima Aula, veremos uma introdução sobre a Linguagem de
Programação C# e vamos começar a desenvolver nossos primeiros programas.

E, aí, preparado(a) para mais uma jornada de conhecimento?

VIDEOAULA
Após a leitura e o estudo do seu livro-texto, chegou o momento de
complementar seu conhecimento. Vá até seu Ambiente Virtual
de Aprendizagem e acesse a Videoaula referente à Aula.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


53
FOLHA DE RESPOSTAS
Exercício 1 - Consultório Médico

Classes: Agendamento, Consulta, Paciente, Plano de Saúde

Exercício 2 - Empresa de Festa

Classes: Cliente, Tema, Aluguel, Item do Tema

Exercício 3 - Conta de Luz

Comentários da resolução: Os métodos podem possuir retorno e neste exemplo os métodos


verificaMesMenorConsumo e verificaMesMaiorConsumo, retornam um tipo de valor string(texto).
Não fique preocupado neste momento, pois nas próximas aulas, quando começarmos a
desenvolver os códigos, você terá acesso aos detalhes dos métodos com retorno.

Exercício 4 - Horários de Remédios

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


54
Comentários da resolução: Neste exemplo é possível identificar que existem duas classes e que
existe um relacionamento entre elas. Note que, o atributo planilhaHorario é uma coleção da
classe HorarioRemedio, pois para cada prescrição existem vários horários.

Exercício 5 - Controle de Edifício

Exercício 6 - Funcionários

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


55
CRÉDITOS
Figura 1 - Código em C e Assembly - Fonte: Elaborada pelo Autor.

Figura 2 - Exemplo programação funcional - Fonte: Fonte: Elaborada pelo Autor.

Figura 3. Máquina de Von Neumann - Fonte: TUCKER (2009)

Figura 4 - Exemplo de Programa Orientado a Objetos - Fonte: Elaborada pelo Autor.

Figura 5 - Exemplo Programação Funcional - Fonte: (UFRN,2019)

Figura 6 - Exemplo Programação Lógica - Fonte: (SOARES, 2019)

Figura 7 - Linguagem Interpretada - Fonte: (USP,2019)

Figura 8 - Linguagem Compilada - Fonte: Elaborada pelo Autor.

Figura 9 - Linguagem Traduzida - Fonte: TUCKER, 2009).

Figura 10 - Exemplo de Classe e Objeto - Aluno - Fonte: Elaborada pelo autor.

Figura 11 - Exemplo de Classe e Objeto - Livro - Fonte: Elaborada pelo autor.

Figura 12 - Exemplo de Classe e Objeto - Disciplina - Fonte: Elaborada pelo autor.

Figura 13 - Exemplo de classe - Fonte: adaptada de (SINTES, 2002)

Figura 14 - Pilares de POO - Fonte: (ALVES,2019).

Figura 15 - Exemplo de Herança - Fonte: Elaborada pelo autor.

Figura 16 - Planilha de Controle de Gastos - Fonte: (MELO,2006)

Figura 17 - Exemplo e Diagrama de Classe - Fonte: Elaborada pelo autor.

Figura 18 - Exemplo de Classe - Diagrama e Código C# - Fonte: Elaborada pelo autor.

Figura 19 - Exemplos de associação binária - Fonte: Elaborada pelo autor

Figura 20- Exemplos de multiplicidade - Fonte: Adaptado de (BOOCK,2006)

Figura 21- Associação Unária - Fonte: Elaborada pelo autor.

Figura 22- Agregação - Fonte: Elaborada pelo autor

Figura 23- Composição - Fonte: adaptada de (BOOCK,2006)

Figura 24- Herança (Generalização e Especialização) - Fonte: Elaborada pelo autor

Figura 25- Classe associativa - Fonte: Elaborada pelo autor

Figura 26- Dependência - Fonte: Elaborada pelo autor

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


56
REFERÊNCIAS
BEZERRA, Eduardo. Princípios de análise e projeto de sistemas com UML. 2 ed. Rio de Janeiro:
Elsevier, 2007.

BOOCK, Grandy; RUMBAUGH, James; JACOBSON , Ivar. UML guia do usuário: o mais avançado
tutorial sobre Unified Modeling Language (UML), elaborado pelos próprios criadores da
linguagem. 2 ed. Rio de Janeiro: Campus, 2006.

EDELWEISS, Nina; LIVI, Maria Aparecida Castro. Algoritmos e programação com exemplos em
Pascal e C. 2014.

FELIX, Rafael. Programação Orientada a Objetos. São Paulo: Pearson, 2016.

GUDWIN, Ricardo R. Linguagens de programação. Campinas: DCA/FEEC/UNICAMP. 1997.

MANZANO, José Augusto N. G. Programação de computadores C#. São Paulo: Érica, 2014.

MELO, Ana Cristina. Exercitando modelagem em UML. Brasport, 2006.

SEBESTA, Robert W. Conceitos de Linguagens de Programação-11. Bookman Editora, 2018.

SILVA, Ricardo Pereira. UML 2: modelagem orientada a objetos. Visual Books, 2007.

SINTES, Anthony. Aprenda programação orientada a objeto em 21 dias. São Paulo: Makron
Books, 2002.

TUCKER, A.; NOONAN, R. Linguagens de Programação - 2.ed.: Princípios e Paradigmas [s.n.],


2009. ISBN 9788563308566.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


57
SUMÁRIO

AULA 2
Objetivos Específicos:

• Reconhecer a estrutura da tecnologia .NET.


• Revisar sobre lógica de programação utilizando a linguagem C#.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


58
UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS
2
AULA 2 - INTRODUÇÃO A LINGUAGEM C# E UMA
REVISÃO SOBRE LÓGICA COMPUTACIONAL
CONTEXTUALIZANDO A APRENDIZAGEM
Prezado(a) Aluno(a), na Aula anterior, você estudou sobre os conceitos da Programação
Orientada a Objetos. Então, você deve estar ansioso(a) para aplicar os conceitos de
Programação Orientada a Objetos que foram abordados, não é mesmo? Mas antes de
iniciarmos os estudos de desenvolvimento de software orientado a objetos, iremos realizar nessa
aula, um estudo sobre a linguagem C# que será utilizada na maioria dos exemplos e projetos
desenvolvidos nessa disciplina. Vamos praticar e resolver exercícios para que você possa
familiarizar-se com a estrutura da linguagem C#. Além disso, vamos revisar sobre Lógica de
Programação e conhecer as ferramentas e caminhos que podem auxiliar no seu aprendizado.

Fique atento(a)! Todos os exercícios desenvolvidos e propostos nesta aula, estão disponíveis no
AVA (Ambiente Virtual de Aprendizado).

Espero que esteja curioso para iniciar seus estudos no fantástico mundo da linguagem C#.

Boa aula!

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


59
MAPA MENTAL PANORÂMICO
Para contextualizar e ajudá-lo(a) a obter uma visão panorâmica dos conteúdos que você
estudará na Aula 2, bem como entender a inter-relação entre eles, é importante que se atente
para o Mapa Mental, apresentado a seguir:

AULA 2 - INTRODUÇÃO A
LINGUAGEM C# E UMA REVISÃO
SOBRE LÓGICA COMPUTACIONAL

Plataforma .NET

HISTÓRIA DA LINGUAGEM
C#

INSTALANDO A IDE VISUAL


STUDIO

CRIANDO O PRIMEIRO
PROGRAMA EM C#
ESTRUTURA DAS CLASSES E
DA LINGUAGEM
VARIÁVEL NA LINGUAGEM
DE PROGRAMAÇÃO
OPERADORES
ARITMÉTICOS, TIPOS DE
DADOS E COMANDOS DE
TIPOS DE DADOS NA SAÍDA E ENTRADA
LINGUAGEM C#

ENTRADA E SAÍDAS DE
DADOS
CONSTRUÇÃO DE
PROGRAMAS C#
CONVERSÃO ENTRE TIPO
DE DADOS E ENTRADA DE DESVIO CONDICIONAL
DADOS SIMPLES

DESVIOS CONDICIONAIS DESVIO CONDICIONAL


COMPOSTO

DESVIO ENCADEADO

ESTRUTURA REPETITIVA
USANDO WHILE
ESTRUTURA REPETITIVA
ESTRUTURA REPETITIVA
USANDO FOR

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


60
1. PLATAFORMA .NET
Você já ouviu o termo .NET? Esta estrutura foi lançada em 13 de fevereiro de 2002 pela Microsoft
com objetivo de ser um ambiente gerenciado para desenvolvimento de software. Atualmente
possui basicamente três frameworks de apoio para desenvolvimento de software (FIGURA 1).
O primeiro e mais antigo é o Framework .NET que surgiu com lançamento da plataforma. Em
seguida o Xamarin que pode ser utilizado no desenvolvimento de aplicativos móveis e o último
lançamento foi .NET Core, lançado em 2016 e atualmente muito utilizado por possuir algumas
vantagens em relação ao .NET Framework (MICROSOFT, 2018).

saiba mais!
.NET Core é uma estrutura de código aberta para desenvolvimento de software para
sistemas operacionais Windows, Linux e MacOS. Possui suporte para C#, F# e outras
linguagens.

Figura 1 - Estrutura básica .NET

Fonte: (MICROSOFT, 2018)

A plataforma .NET é um ambiente que possibilita a nós


programadores trabalharmos com várias linguagens de GLOSSÁRIO
programação que podem ser fornecidas pela Microsoft
(C#, Visual Basic .NET e Visual C++) ou por terceiros, como INTEROPERABILIDADE
se fossem uma única linguagem, por meio do conceito de
é a capacidade de um
interoperabilidade. É possível escrever uma única aplicação
software se comunicar de
a partir de diversas linguagens em um mesmo ambiente.
forma transparente com
No entanto, para que a interoperabilidade funcione, a
outro software.
plataforma .NET compila o código de cada linguagem

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


61
usada em uma outra linguagem interna de baixo nível chamada CIL (Common Intermediate
Language), também conhecida por IL (Intermediate Language) e MSIL (Microsoft Intermediate
Language) (MANZANO, 2014).

Figura 2 - Processo de tradução e compilação

Fonte: (MICROSOFT, 2018)

Figura 3 - Exemplo de C# e CIL

Fonte: (MANZANO, 2014)

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


62
O processo de compilação de um programa na plataforma .NET (Figura 2), ocorre sob o aspecto
de um modelo chamado modo gerenciado, no qual o programa escrito em uma linguagem
é convertido na linguagem intermediária CIL. No entanto, o processo de compilação gera
um conjunto de metadados com outras informações do processo de compilação. O conjunto
formado pelo código IL, mais os metadados, constitui o que se chama no universo .NET de
código assembly. O assembly de uma aplicação .NET é formado por um código executável ou
arquivo de biblioteca criado a partir da linguagem IL e dos metadados. O assembly gerado é
enviado à plataforma .NET para então, ser executado e nesse caso, ocorre a segunda etapa
da compilação em que o código assembly passa por um compilador chamado JIT (Just-In-
Time), que gera o código de máquina da aplicação baseado no .NET Framework (MANZANO,
2014). A Figura 3 mostra um exemplo de código desenvolvido na linguagem C# e seu código
correspondente em IL.

Figura 4 - Frameworks

Fonte: (MICROSOFT,2018)

Para que um software desenvolvido na plataforma .NET


funcione, é necessário que seja instalado no sistema
operacional a versão do Framework, no qual o software foi
GLOSSÁRIO
desenvolvido, por exemplo, se utilizar o Framework .NET, será
FRAMEWORK
necessário instalar este framework no dispositivo. A Figura 4
representa um resumo desta estrutura. Perceba que entre o É a centralização (interseção)
sistema operacional e as aplicações existe um framework. das funcionalidades comuns
entre várias linguagens.
Disponibiliza estruturas pré-
saiba mais! definidas para que sejam
Atualmente é possível desenvolver projetos na utilizadas pela linguagem de
linguagem Python e R na plataforma .NET. Essas programação.
linguagens são as mais utilizadas na área de Ciências
de Dados.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


63
2. HISTÓRIA DA LINGUAGEM C#
A linguagem C# trabalha com Programação Orientada a Objetos e foi criada pela empresa
Microsoft e apresentada no lançamento da plataforma .NET em 2002. Ela foi criada do ponto
zero, com influências das linguagens C++, Pascal e Java. O desenvolvimento dessa linguagem
foi liderado pelos engenheiros Anders Hejlsberg e Scott Wiltamuth. Atualmente essa linguagem
pode ser utilizada para produzir softwares console (Modo texto), em modo gráfico (Windows
Forms), Web e outras estruturas existentes na plataforma .NET (MANZANO,2014). A Figura 5
representa um exemplo de software Console e Windows Forms.

Figura 5 - Exemplo de Console e Windows Forms

Fonte: Elaborada pelo próprio autor.

Resumindo, a linguagem C# é uma linguagem de alto nível, utilizada para programação


visual, dirigida por eventos e totalmente orientada a objetos, na qual os programas são criados
utilizando uma IDE (Integrated Development Environment) (DEITEL,2003).

importante

A linguagem C# é case sensitive, ou seja, diferencia letras maiúsculas e


minúsculas. Então, se criarmos dentro do mesmo contexto, dois objetos com o
nomes Soma e soma, ele serão objetos distintos dentro do contexto.

saiba mais!
Antes do seu lançamento, a linguagem C# se chamava Cool. Atualmente, C# pode
ser utilizado no desenvolvimento de aplicativos para dispositivos móveis por meio do
Xamarin.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


64
3. FERRAMENTAS IDE
IDE, ou Ambiente Integral de Desenvolvimento (Integrated Development Environment) é
atribuído a todo software que tem como objetivo auxiliar no desenvolvimento de outros
softwares. As IDEs possuem opções para otimizar o tempo gasto com o desenvolvimento de
produtos de software e outras características, como: performance e testes automatizados.

O propósito de uma IDE é unificar as atividades realizadas pelos programadores durante a


implementação de um produto de software. Entre estas atividades, estão a edição de código,
a compilação, a execução/depuração, a análise de desempenho e o teste. Entretanto, para
outras tarefas, você pode utilizar uma ferramenta externa que, em grande parte dos casos,
pode ser integrada à IDE (DEVMEDIA, 2018).

Existem várias IDEs disponíveis no mercado, se desejar desenvolver projetos de software em


outras linguagens. Você pode utilizar o NETBEANS que é um ambiente integrado gratuito
para desenvolvimento de projetos de software nas linguagens JAVA, JavaScript, HTML, PHP,
C/C++ Groovy entre outras linguagens. O ECLIPSE pode ser utilizado no desenvolvimento das
linguagens JAVA, C/C++, PHP entre outras. O Visual Studio da Microsoft pode ser utilizado para
desenvolvimento de software na linguagem C#.

saiba mais!
No passado, os desenvolvedores de software utilizavam apenas um editor de texto para
escrever seus programas. Atualmente, temos a facilidade de utilizar ferramentas IDEs
que auxiliam na produtividade e outras atividades relacionadas ao desenvolvimento de
software, por exemplo, a possibilidade de realizar testes automatizados.

4. INSTALANDO A IDE VISUAL STUDIO


Durante a disciplina de Programação Orientada a Objetos e outras disciplinas ao longo
de nosso curso, iremos desenvolver softwares na linguagem C#. Então, chegou a hora de
instalar a IDE Visual Studio para você iniciar no fantástico mundo da programação. Esta IDE
é a principal ferramenta utilizada para desenvolvimento na linguagem C#, seja projeto WEB,
Console, WindowsForms, Xamarin e entre outros. A Microsoft disponibiliza uma versão gratuita,
denominada comunitária (community), que pode ser baixada em: https://www.visualstudio.
com/pt-br/downloads

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


65
DICA DO AUTOR
Se preferir uma ferramenta para utilizar no linux ou que tenha uma menor
quantidade de recursos e tenha um consumo computacional menor, utilize o
Visual Code, disponível em https://code.visualstudio.com/download. Mas lembre-
se que durante a disciplina vou apresentar os exercícios utilizando o Visual Studio.

Agora que você já realizou o download do Visual Studio Community, vamos realizar a instalação.
A seguir, são apresentados os principais passos da instalação.

Primeira etapa (Figura 5): é mostrada uma mensagem sobre os termos de licença e da política
de privacidade da Microsoft.

Figura 5 - Tela inicial da instalação

Fonte: Tela Visual Studio 2017 - Microsoft

Segunda etapa (Figura 6): nesta etapa é possível personalizar sua instalação, ou seja, neste
momento você pode definir quais os recursos você deseja utilizar. Quanto maior a quantidade
de recursos, maior o consumo de memória e o processamento da máquina. Durante a disciplina,
vamos utilizar projetos desenvolvidos no Console, Windows Forms e Web. Então marque as
alternativas relacionadas com esses tipos de projetos.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


66
Figura 6 - Recursos

Fonte: tela visual Studio 2017 - Microsoft

Terceira Etapa (Figura 7): nesta etapa é possível instalar os pacotes de idiomas opcionais.

DICA DO AUTOR
Na área de TI você será obrigado a utilizar o inglês, então, utilize todas as ferramentas
e recursos neste idioma. Esta é uma das melhores formas de realizar uma imersão e
aprender os termos em inglês utilizados na área da computação.

Figura 7 - Idiomas

Fonte: Tela Visual Studio 2017 - Microsoft

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


67
Quarta etapa (Figura 8): nesta opção é possível alterar o local de instalação do Visual Studio,
mas isto é opcional. Sugiro que você deixe a instalação no local pré-definido pelo instalador.

Figura 8 - Local da instalação

Fonte: Tela Visual Studio 2017 - Microsoft

Fantástico! Com a ferramenta instalada e pronta para ser utilizada, vamos desenvolver o nosso
primeiro programa na linguagem C#.

5. CRIANDO O PRIMEIRO PROGRAMA EM C#


Agora que já aprendemos sobre a história da linguagem C# e sobre a plataforma .NET, vamos
desenvolver a nossa primeira aplicação utilizando o Visual Studio. Como já foi comentado,
todos os exercícios desenvolvidos durante esta aula estão disponíveis no AVA do UNIARAXÁ.
Porém, sugiro que você tente resolvê-los sem consultar os programas disponíveis.

A seguir vamos conhecer os passos para você criar o seu primeiro programa na linguagem C#.

Passos:

1 - Abra o Visual Studio e entre em File/New Project

2 - Selecione a Linguagem Visual C# e selecione um Projeto Console App (.NET Framework).


Nesta tela (Figura 9) existem algumas opções que podem ser modificadas, como: a escolha do
nome (name) do seu projeto, a definição do nome da solução (solution), a escolha da versão
do Framework e o local onde o projeto será salvo.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


68
importante

Uma solução (solution) é uma forma de centralizar vários


projetos. Por exemplo, seria possível adicionar vários projetos
na mesma solução (solution).

Figura 9 - Criando projeto

Fonte: Tela visual Studio 2017 - Microsoft

3 - Após criar o projeto, é apresentado a tela (Figura 10) com a classe Program que é a primeira
classe a ser executada quando o programa é iniciado. Então adicione os comandos da linha 8
e 9 (Figura 10) que são responsáveis por mostrar uma mensagem “Hello World” na tela e realizar
uma pausa (aguarda uma tecla ser pressionada).

Figura 10 - Classe Program

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


69
4 - Ao entrar no menu Debug e clicar na opção Start Debugging todo o processo de
transformação do código fonte em código binário é realizado e uma mensagem no estilo
console é apresentada na tela (Figura 11).

Figura 11 - Hello World

Fonte: Elaborada pelo Autor.

Como este programa foi construído: durante a execução deste exemplo, o Visual Studio analisou
se existia erro de sintaxe. No segundo passo, o compilador gerou o código intermediário (CIL
- Common Intermediate Runtime). Depois o tradutor CLR (Common Language Runtime) gerou
um arquivo executável (exe). Por último, o Visual Studio executou o assembly gerado e em
seguida o CLR carregou o código CIL que foi gerado pelo compilador, e por fim, o código foi
executado no Sistema Operacional.

Parabéns!!!! Este foi seu primeiro exemplo utilizando a linguagem C#, a seguir vamos estudar
alguns conceitos sobre variáveis e tipos de dados. Em seguida, teremos outros exemplos para
exercitarmos sobre lógica de programação.

6 Variável na linguagem de programação

Você e seu amigo precisam realizar uma conta. Então, você diz: ”Vamos somar dois números?
”. E continua: “O primeiro número é 5”. Seu amigo guarda o primeiro número na “cabeça”, ou
seja, na memória. Então você diz: “O segundo número é 3”. Então seu amigo também guarda
o segundo número na memória, sem esquecer o primeiro número, ou seja, cada número foi
armazenado em posições diferentes da memória humana, sem sobreposição. Então, você
pergunta: “Qual é o resultado da soma?”. Seu amigo resgata os valores armazenados na sua
memória, realiza a conta e responde dizendo que o resultado é 8 (ASCENCIO, 2008).

Você deve estar pensando: existe uma relação da memória humana e variáveis? Sim, pois

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


70
um algoritmo geralmente recebe dados que precisam ser armazenados no computador para
serem utilizados no processamento. Estes valores são armazenados em um local da memória,
fato idêntico ao realizado pela memória humana (ASCENCIO, 2008).

E como os dados são armazenados? Os computadores trabalham com sistema numérico


binário e, nesse sistema, os dados são transformados em 0 e 1 (‘zeros’ e ‘uns’) para, então,
serem armazenados na memória. Cada dígito binário (1 e 0) ocupa uma porção de memória
chamada bit, e um conjunto de 8 bits é denominado byte. Cada byte é identificado e
acessado por meio de um endereço (ASCENCIO, 2008). Então uma variável, ocupa um espaço
na memória e consome uma quantidade de bytes e bit, por exemplo, ao armazenar a letra
“A”, ela irá ocupar 1 byte que corresponde a 8 bits da memória do computador.

Durante o desenvolvimento de software você será obrigado a criar várias variáveis, por exemplo,
se for desenvolver um programa simples para calcular a soma de dois valores inteiros, você
provavelmente irá utilizar três variáveis, duas para os valores a serem somados e uma para
armazenar o resultado. Veja que este procedimento é idêntico ao realizado pela memória
humana e estas variáveis criadas no computador irão consumir uma parte da memória do
computador.

Por outro lado, além de saber o que significa variável, você precisa conhecer e definir qual o
tipo de dado que será armazenado para reservar um espaço compatível com este tipo. Por
exemplo, se for armazenar um número inteiro é preciso definir que a variável é compatível com
este tipo. A seguir serão apresentados os principais tipos de dados utilizados na linguagem C#.

saiba mais!
Existem vários estudos relacionados à computação quântica para tentar substituir a
forma binária utilizada para armazenar dados. Para aprender mais sobre computação
quântica, assista ao vídeo do Professor da USP, Frederico Borges de Brito: https://youtu.
be/SA51x26sKqc.

7. TIPOS DE DADOS NA LINGUAGEM C#


Como discutimos no tópico anterior, as variáveis precisam possuir um tipo. Na linguagem C#
existem dois “agrupamentos” de tipos de dados. No primeiro grupo, são agrupados os tipos por
valor, onde o espaço reservado na memória é utilizado para armazenar o valor. O segundo
grupo é considerado de referência, pois o endereço das variáveis na memória é utilizado para
armazenar o endereço onde os dados estão armazenados. A Figura 12 representa o código de
uma classe com dois grupos de tipos de dados. A variável A, é uma variável do tipo inteiro que
armazena os valores no mesmo local da memória que foi criada. Por outro lado, nome é uma

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


71
variável do tipo string (texto) e o no seu valor é armazenado o endereço da memória onde
está armazenado o valor “UNIARAXÁ” MICROSOFT(2016).

Figura 12 - Stack e Heap

Fonte: Elaborada pelo Autor.

Além da definição de variável de referência e valor discutido anteriormente, os tipos de valor


da linguagem C# são divididos em tipos simples, tipos de enum, tipos struct e tipos de valor
anulável. Os tipos de referência do C# são divididos em tipos de classe, tipos de interface, tipos
de matriz e tipos delegados MICROSOFT (2016).

! FIQUE ATENTO!

Durante o desenvolvimento e com tempo de experiência a escolha do tipo


correto para cada dado torna-se natural. Então, durante a disciplina você terá
vários exemplos e exercícios para auxiliá-lo a utilizar os principais tipos de dados.

A seguir são apresentados os principais tipos de dados na linguagem C# e sua classificação:

Tabela 1: Tipos e classificação de dados na linguagem C#

Tipos de valor
Tipos simples:
- Integral sem sinal: byte, ushort, uint,ulong
- Caracteres Unicode: char
- Ponto flutuante IEEE: float, double
- Decimal de alta precisão:decimal
- Booleano: bool
Tipos enum:
- Tipos definidos pelo usuário do formulário enum E {...}
Tipos struct:
- Tipos definidos pelo usuário do formulário struct S {...}
Tipos de valor anuláveis:
- Extensões de todos os outros tipos de valor com um valor null

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


72
Tipos de Referência
Tipos de classe:

- Classe base definitiva de todos os outros tipos: object


- Cadeia de caracteres Unicode: string
- Tipos definidos pelo usuário do formulário class C {...}
- Tipos de interface
- Tipos definidos pelo usuário do formulário interface I {...}
-
Tipos de matriz:
- Unidimensional e multidimensional, por exemplo, int[] e int[,]

Tipos delegados
- Tipos definidos pelo usuário do formulário delegate int D(...)
Fonte: Elaborado pelo Autor.

A Figura 13 representa um resumo dos tipos mais utilizados na linguagem C#. Nesse exemplo,
você pode analisar a faixa de dados permitida para cada tipo, por exemplo, um tipo booleano
pode receber os valores true e false e o tipo Sbyte pode receber valores entre 0 a 255.

Figura 13 - Tipos de dados

Fonte: (MICROSOFT, 2018)

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


73
Conhecer os limites dos tipos de dados das linguagens de

CUIDADO programação pode auxiliar na performance e coerência da


estrutura de um programa.

No C# você pode utilizar declarações de tipos para criar novos tipos. Uma declaração de tipo
especifica o nome e os membros do novo tipo. Cinco das categorias do C# de tipos, são tipos
definidos pelo usuário: classe, struct, interface, enum e delegados (MICROSOFT,2016).

a) Um tipo classe define uma estrutura de dados que contém atributos, métodos e
outras características. Este tipo fornece suporte para as características necessárias
para que uma classe tenha as características da programação orientada a
objetos (MICROSOFT,2016).

b) Um tipo struct tem características idênticas a uma classe, porém, diferente das
classes, as structs são tipos de valor e, normalmente, não precisa de alocação
de heap (FIGURA X). Além disso, não possui suporte a várias características da
programação orientada a objetos, por exemplo, herança (MICROSOFT,2016).

c) Um tipo interface define um contrato como um conjunto de membros da


função pública. Uma classe que implementa uma interface deve fornecer
implementações de membros da função da interface. Uma interface pode
herdar de várias interfaces base e uma classe pode implementar várias interfaces
(MICROSOFT,2016).

d) O tipo delegate representa referências aos métodos com uma lista parâmetros
e tipo de retorno específicos. Objetos delegados possibilitam o tratamento de
métodos como entidades que possam ser atribuídas a variáveis e passas como
parâmetro (MICROSOFT,2016).

CONECTANDO

Agora vamos realizar uma revisão básica sobre Lógica Computacional e um estudo
sobre a estrutura da linguagem C#. Então, neste momento é importante que você
tente resolver os exercícios, pois o conteúdo desta aula servirá como base para as
próximas aulas.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


74
8. CONSTRUÇÃO DE PROGRAMAS C#
A seguir vamos conhecer alguns elementos relacionados à Lógica Computacional da
linguagem C#. Vamos aprender como receber um valor de entrada, por exemplo, um valor
digitado pelo usuário. Como escrever valores na tela (console). Vamos manipular alguns tipos
de dados e aprender sobre conversão entre tipos de dados. Por fim, vamos realizar uma revisão
e estudo sobre os comandos condicionais e de repetição.

8.1 ESTRUTURA DAS CLASSES E DA LINGUAGEM


Conforme apresentado no início, nessa aula não vamos desenvolver programas orientado
a objetos, pois nosso principal objetivo neste momento é conhecer a linguagem C# e seus
principais elementos. Então, durante os próximos exemplos, vamos desenvolver programas
com a utilização da classe Program. Então, para auxiliar no seu aprendizado, vamos conhecer
como é a estrutura de uma classe, em especial a classe program.

Figura 14 - Classe Program

Fonte: Elaborada pelo autor.

Na Figura 14, temos um exemplo da classe Program. Entre as Linha 1 e 5 estão as declarações
dos namespaces, que podem ser considerados estruturas pré-definidas ou bibliotecas que
podem ser utilizadas pela classe. Por exemplo, se fosse retirado a linha 1 (using System;), para
executar os comandos das linhas 13 e 14, seria necessário adicionar o caminho completo:
System.Console.WriteLine(“Hello Word”). Além disso, note que os namespace que não foram
utilizados estão na cor cinza (linha 2 a 5). Na linha 7, temos o namespace da classe, denominado
primeiroExemplo. Esta característica pode ser utilizada para agrupar as classes, por exemplo, as

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


75
classes de um software acadêmico relacionadas ao cadastro de alunos poderiam pertencer
ao namespace Alunos. Na linha 9, é definido o nome da classe e suas possíveis heranças ou
“contratos” com interfaces.

Os comandos entre as linhas 11 e 15 pertencem a um método. Neste exemplo, temos o método


estático Main que é o primeiro a ser executado pelo programa.

Como foi apresentado no início desta aula, a linguagem C# é case sensitive, ou seja, diferencia
palavras maiúsculas de minúsculas. Outro fato é que, a linguagem C# possui na sua sintaxe a
necessidade da utilização de ponto e vírgula para encerrar a execução de cada instrução.
Além disso, note que na linha 12 possui uma chave de abertura do contexto do método Main
e na linha 15, uma chave fechando o contexto, ou seja, tudo o que está entre as linhas 12 e 15
fazem parte do mesmo contexto.

Você deve estar pensando: temos apenas uma classe em um programa console? A resposta
é Não. Como qualquer linguagem orientada a objetos é possível criar várias classes, seja no
mesmo arquivo ou arquivos diferentes. A Figura 15 representa como seria a estrutura das classes
dentro de uma aplicação em C#. O exemplo representa parte de uma aplicação acadêmica
e de uma biblioteca que pertencem ao mesmo produto de software, porém, estão organizadas
por namespace de acordo com a categoria das classes.

Figura 15 - Estrutura das classe

Fonte: Elaborada pelo autor.

importante

Não fique preocupado(a), pois o conteúdo sobre classes será


abordado na próxima Aula.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


76
8.2 OPERADORES ARITMÉTICOS, TIPOS DE DADOS E COMANDOS DE SAÍDA E ENTRADA
No início desta aula, você conheceu os conceitos de variáveis e tipos de dados. Vamos analisar
a estrutura dos principais tipos de dados da linguagem C#.

Figura 16 - Código com tipo de dados

Fonte: Elaborada pelo autor.

No exemplo de código da Figura 16, você pode analisar alguns tipos de dados utilizados na
linguagem C#. Note que foi utilizado o comando Console.WriteLine() para escrever os valores
na tela do console. Nas linhas 20 e 21 utilizamos o int.MaxValue e int.MinValue, que mostram
qual o limite máximo e mínimo de uma variável. O comando Console.ReadLine() utilizado para
leitura de entrada de dados, neste contexto, serviu para pausar a tela até que uma tecla seja
pressionada.

Neste momento, você precisa conhecer algumas regras de sintaxe e de boas práticas na
definição de variáveis:

a) não começar o nome de uma variável com um dígito;

b) não utilizar acentuação;

c) não utilizar nome composto;

d) utilize nomes que tenham significado dentro do contexto do programa.

A Tabela 1 apresenta alguns exemplos incorretos de declaração de variáveis e sugestões de


correção.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


77
Tabela 2 - Como declarar uma variável

Exemplos de declaração de variáveis


Errado Sugestão de correção
int 7hora; int hora7;
String 2andar; int _2andar;
String nome completo; int nome_completo;
Fonte: Elaborada pelo autor.

O programa da Figura 17 representa a utilização de alguns operadores aritméticos. Note


que existem alguns detalhes. Na Linha 16, ao dividir a variável J que possui o valor 10 por 6
o resultado é 1. Isto acontece devido ao tipo de dado que é int. Então, o valor é truncado
desconsiderando as casas decimais. Na linha 17, o símbolo % representa o resto da divisão.

Figura 17 - Operadores aritméticos

Fonte: Elaborado pelo autor.

importante

A utilização dos exemplos em console serve para facilitar o


aprendizado sobre estrutura .NET e linguagem C#. Mais adiante
na disciplina, teremos outros exemplos utilizando interface
Windows Forms.

Na Tabela 3 você pode analisar os tipos de operadores aritméticos da linguagem C#.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


78
Tabela 3 - Operadores aritméticos

Fonte: Elaborada pelo autor.

Além dos operadores aritméticos comuns, na linguagem C# você pode utilizar operadores
aritméticos de atribuição, que representam uma forma resumida de atribuição de valores. No
programa da Figura 17 ,nas linhas 19 e 20, utilizamos alguns operadores de atribuição. A Tabela
4, representa os principais operadores de atribuição da Linguagem C# .

Tabela 4 - Operadores aritméticos de atribuição

Exemplos de operadores aritméticos de atribuição


Operador Exemplo Significado
+= int A=10; int A=10;
A +=2; A = A + 2;
-= int A=10; int A=10;
A -=1; A=A-1;
*= int A=10; int A=10;
A *=2; A =A * 2;
/= int A=10; int A=10;
A /=2; A =A/ 2;
Fonte: Elaborada pelo autor.

8.3 ENTRADA E SAÍDAS DE DADOS


Geralmente, o software precisa receber dados de entrada que são inseridos pelo usuário e,
em alguns situações, é necessário apresentar algum resultado de saída. Em projetos console
existem alguns comandos que podem ser utilizados para leitura e apresentação de dados.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


79
Figura 18 - Comandos de entrada e saída

Fonte: Elaborada pelo autor.

O programa apresentado pela Figura 18 realiza a soma de duas variáveis denominadas IdadeA
e IdadeB. Em seguida, é apresentado a soma das idades na tela. Neste exemplo, os valores da
idadeA e idadeB devem ser digitados pelo usuário. O comando Consolde.ReadLine() realiza
uma leitura do valor digitado. Note que na linha 15, o valor digitado pelo usuário é lido e
armazenado na variável nome. Como todo valor de entrada é do tipo string, na leitura das
idades A e B (linha 19 e 22) foi necessário realizar um Parse (int.Parse()) para converter o valor
String para int.

Ainda no mesmo exemplo, foi utilizado o Console.WriteLine() para imprimir o resultado na


tela. Note que na linha 25, além de imprimir o valor foi adicionado uma mensagem antes do
resultado, neste exemplo foi utilizado o conceito de concatenação (“Resultado:” + soma) que
produziu a mensagem “Resultado: 51”.

VAMOS PRATICAR?!
EXERCÍCIO RESOLVIDO 1:

Criar um projeto utilizando a linguagem C# e que receba os valores inteiros A, B e C e mostre


na tela o resultado da seguinte expressão: X = A (B + C). Por exemplo, se o valor digitado foi A
= 10, B = 1 e C = 1. Deve aparecer a mensagem na tela: “Resultado: 20”.

Observação: A resolução deste exercício está disponível no final desta aula e o código está
disponível no AVA.

8.4 CONVERSÃO ENTRE TIPO DE DADOS E ENTRADA DE DADOS


Durante o desenvolvimento, você pode realizar conversão entre variáveis com tipo de dados

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


80
distintos. Por exemplo, armazenar uma variável double em uma variável float. Isto ocorre
devido a forma que as variáveis são manipuladas e devido a precisão do armazenamento. Na
linguagem C#, as conversões são classificadas em:

Conversões implícitas: nenhuma sintaxe especial é necessária porque a conversão é de tipo


seguro e nenhum dado será perdido. Exemplos incluem conversões de tipos integrais menores
para maiores e conversões de classes derivadas para classes base (MICROSOFT, 2018).

Conversões explícitas (casts): as conversões explícitas exigem um operador cast. A conversão é


necessária quando as informações podem ser perdidas na conversão ou quando a conversão
pode não funcionar por outros motivos. Exemplos típicos incluem a conversão numérica para
um tipo que tem menos precisão ou um intervalo menor e a conversão de uma instância de
classe base para uma classe derivada (MICROSOFT,2018).

Conversões definidas pelo usuário: as conversões definidas pelo usuário são realizadas por
métodos especiais que podem ser definidos para habilitar conversões explícitas e implícitas entre
tipos personalizados que não têm uma relação de classe base/classe derivada (MICROSOFT,
2018).

Conversões com classes auxiliares: para converter entre tipos não compatíveis, assim como
inteiros e objetos System. DateTime, ou cadeias de caracteres hexadecimais e matrizes de
bytes, você pode usar a classe System.BitConverter, a classe System.Convert e os métodos
Parse (MICROSOFT, 2018).

Figura 19 - exemplos de conversão de dados

Fonte: Elaborada pelo autor.

O programa apresentado na Figura 19, contém alguns exemplos de conversões de dados.


Note que na linha 14, a variável B do tipo long, recebe os valores da variável A que é do tipo
int, sem a necessidade de utilizar comandos de conversão. Este tipo de conversão é chamado
de implícita.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


81
No exemplo da linha 17, foi necessário realizar um casting (conversão explícita), para evitar que
os valores sejam perdidos.

importante

Mesmo utilizando um casting pode haver perda de dados,


por exemplo, na linha 18 um valor do tipo double é convertido
para um tipo int. Note que as casas decimais foram ignoradas
durante o casting.

saiba mais!
As variáveis das linguagens Javascript, PHP e Python não são tipadas, isto significa que
elas não possuem tipo ao serem criadas.

8.5 DESVIOS CONDICIONAIS


Para um programa de computador tomar decisões, é necessário criarmos para ele uma
condição. Assim, para tomar uma decisão, é necessário existir uma condição. Uma condição
pode produzir uma de duas respostas: pode ser uma resposta verdadeira ou uma resposta falsa.
A condição, por sua vez, do ponto de vista condicional, é a definição de relação lógica entre
variáveis versus variáveis ou variáveis versus constantes definidas com o uso de operadores
relacionais. A relação lógica existente entre os elementos de uma condição é conseguida
com a utilização dos operadores relacionais, de acordo com a Tabela 5 (MANZANO, 2014).

Tabela 5 - Operadores comparativos (relacionais)

Operadores comparativos (relacionais)


Errado Sugestão de correção
< menor
> maior
>= maior ou igual
<= menor ou igual
== igual
!= diferente
Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


82
Além dos operadores relacionais, você pode utilizar os operadores lógicos para analisar duas
ou mais condições, por exemplo, seja A=10 e B=20. Ao analisar as condições ((A<10) e (B >10)),
o resultado é verdadeiro. A Tabela 6 representa os operadores lógicos utilizados na linguagem
C#.

Table 6 - Operadores lógicos

Operadores Lógicos em C#
V1 V2 V1 && (E) V2 V1 || (OU) V2 ! (NÃO) (V1)
F F F F V
F V F V V
V F F V F
V V V V F
Fonte: Elaborada pelo autor.

A partir do momento em que temos uma condição, podemos em um programa, estabelecer


ações de desvios condicionais. Os desvios condicionais estão associados à utilização de
decisões em um programa de computador. Uma decisão a ser tomada, como já comentado,
pode ser verdadeira ou falsa. Se verdadeira, determinada ação pode ser executada; se falsa,
outra ação pode ou não ser executada. Na programação, um desvio condicional pode ser
simples, composto ou encadeado (MANZANO, 2014).

8.5.1 DESVIO CONDICIONAL SIMPLES


Um desvio condicional será simples quando tivermos uma condição que desvia a execução do
programa, caso o resultado lógico avaliado de certa condição seja verdadeiro. Se o resultado
lógico avaliado for falso, nada acontecerá, e o programa simplesmente segue o seu fluxo de
execução.

if <condição>{
<instrução 1>
<instrução 2>
}

A seguir, temos um exemplo (Figura 20) de desvio condicional simples utilizado na linguagem
C#. Veja que somente aparecerá uma mensagem na tela se o valor de A for maior do que B.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


83
Figura 20 - Desvio condicional simples

Fonte: Elaborada pelo autor.

Neste exemplo a condição é verdadeira, pois, perceba que na linha 15 é realizado um teste
onde A é maior do que B, então a execução das linhas 16 e 17 será realizada.

8.5.2 DESVIO CONDICIONAL COMPOSTO


Você analisou anteriormente como usar a instrução if simples para avaliar determinada
condição (desvio condicional simples). Agora, será explicado como usar a instrução if... else.
Numa instrução If... else, se a condição for verdadeira, será executada a instrução posicionada
entre as instruções if e else. Sendo a condição falsa, será executada a instrução posicionada
logo após a else, como é indicado na seguinte sintaxe (MANZANO, 2014):

if <condição>{
<instrução 1>
<instrução 2>
<instrução N>
}else{
<instrução 1>
<instrução 2>
<instrução N>
}

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


84
A seguir (Figura 21), temos um exemplo de desvio condicional composto. Diferente do exemplo
de desvio simples, este programa apresentará uma mensagem na tela caso o resultado da
condição seja verdade ou caso seja falso.

Figura 21 - Desvio condicional composto

Fonte: Elaborada pelo autor.

Neste Exemplo, a condição é verdadeira, então a mensagem “Maior” será exibida na tela do
console.

8.5.3 DESVIO ENCADEADO


Além dos desvios condicionais simples e composto, é possível utilizar desvios encadeados para
tomada de decisão. Você pode utilizar este tipo quando existirem mais de dois caminhos a
serem analisados.

if (<condição 1>) {
<instrução 1>
<instrução 2>
<instrução N>
}
else if (<condição 2>) {
<instrução 1>
<instrução 2>
<instrução N>
}
else {
<instrução 1>
<instrução 2>
<instrução N>
}

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


85
A seguir, temos um exemplo (Figura 22) de desvio encadeado para analisar três possíveis
caminhos do algoritmo. Note que, de acordo com os valores de A e B, o resultado da primeira
condição será verdadeiro e será apresentada uma mensagem na tela “Maior que B”).

Figura 22 - Desvios encadeados

Fonte: Elaborada pelo autor.

O interessante é que você pode substituir esta estrutura por três estruturas simples, porém, com
a desvantagem de ter uma performance inferior a estrutura encadeada, pois em algumas
situações seriam realizados testes desnecessários.

VAMOS PRATICAR?!
EXERCÍCIO RESOLVIDO 2:

Criar um projeto utilizando a linguagem C# que receba os valores inteiros A, B e C e mostre


na tela qual o maior valor entre os três valores digitados. Considere que os valores digitados
sempre serão diferentes. Além disso, mostre na tela se a soma de A+B+C é um número par ou
ímpar.

Observação: A resolução deste exercício está disponível no final desta aula e o código está
disponível no AVA.

8.6 ESTRUTURA REPETITIVA


Você pode utilizar uma estrutura de repetição quando um trecho de algoritmo ou até mesmo
o algoritmo inteiro precisa ser repetido. O número de repetições pode ser fixo ou estar atrelado
a uma condição. Assim, existem estruturas para tais situações, que serão apresentadas a seguir
(ASCENCIO,2008).

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


86
8.6.1 ESTRUTURA REPETITIVA USANDO WHILE
O while é um exemplo de estrutura repetitiva, pois o comando é repetido enquanto as
condições forem verdadeiras.

while (<condição 1>){


<instrução 1>
<instrução N>
}

O exemplo (Figura 23) a seguir, mostra dez mensagem na tela com os valores de 1 a 10. Note
que na linha 2, foi adicionado um comando para incrementar o valor de B. Cada vez que o
código passar por esta linha, o B aumento um dígito, e isto garante que a repetição finalize
quando chegar no valor 11. Então, a repetição das linhas 18 e 19 serão realizadas enquanto a
condição do while (linha 16) for verdadeira.

Figura 23 - Exemplo while

Fonte: Elaborada pelo autor.

VAMOS PRATICAR?!
EXERCÍCIO 3 (RESOLVIDO):

Imagine a cidade A com 20.0000 habitantes e com crescimento da população de 5% ao ano,


e uma cidade B com 15.000 habitantes e com crescimento de 10% ao ano. Utilizando o while,
mostre na tela em quantos anos a cidade B terá população igual ou maior do que a cidade A.

Observação: A resolução deste exercício está disponível no final desta aula e o código está
disponível no AVA.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


87
O do while é um exemplo de estrutura repetitiva idêntica ao while. Porém, nesta estrutura o
teste é realizado no final e os comandos serão executados pelo menos uma vez. Diferente do
while, que ao testar a condição pela primeira vez e o resultado for falso, os comandos não são
executados.

do {
<instrução 1>
<instrução N>
}while (<condição 1>)

8.6.2 ESTRUTURA REPETITIVA USANDO FOR


A estrutura de repetição for, possui um valor de início, uma condição que é testada e um
incremento do valor que foi iniciado. Esta estrutura possui a vantagem de forçar o desenvolvedor
a colocar o incremento, pois o mesmo faz parte da sintaxe da estrutura.

for (início;condição;incremento) {
<instrução 1>
<instrução N>
}

O exemplo (Figura 24) a seguir, mostra na tela todos os dígitos entre 1 e 10. Note que o comando
I++ realiza o incremento para tornar a condição (I<=10) falsa.

Figura 24 - Exemplo de for

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


88
Foreach é uma estrutura repetitiva muito
utilizada, principalmente na manipulação
de lista. Porém, será abordada nas próximas

CUIDADO aulas.

VAMOS PRATICAR?!
EXERCÍCIOS SUGERIDOS

• Utilizando uma das estruturas repetitivas apresentadas, desenvolva um programa em C#


que imprima a soma dos números de 1 até 1000.

• Utilizando uma das estruturas repetitivas apresentadas. desenvolva um programa em C#


que imprima os fatoriais de 1 a 10. Exemplo: 3! = 3 * 2 *1.

• Uma pessoa só pode votar em eleições brasileiras se ela for maior que 16 anos e for
cidadã brasileira. Crie um programa com duas variáveis, int idade, bool brasileira , e
faça com que o programa diga se a pessoa está apta a votar ou não, de acordo com
os dados nas variáveis (CAELUM,2019).

FOLHA DE RESPOSTAS

Exercício 01

Comentários: Na matemática a função X = A(B+C) é aceita. Porém, na computação é


necessário deixar claro o tipo de operação aritmética. Então, é necessário adicionar o * para
representar a multiplicação.

Figura 25 - resolução do exercício 01

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


89
Exercício 02

Comentários: Para resolver este exercício você pode utilizar desvios encadeados.

Figura 26 - resolução do exercício 02

Fonte: Elaborada pelo autor.

Exercício 03

Comentários: Nas linguagens de programação, não existe um cálculo direto relacionado


a porcentagem. Então, para este tipo de cálculo, é necessário utilizar outros métodos
matemáticos, como realizado nas linhas 19 e 20. Perceba que enquanto a cidade B for menor
do que A. as linhas 19, 20 e 21 serão executadas. Na linha 19 é realizado o acréscimo de 10%
na população da cidade B. Na linha 20 é realizado o acréscimo de 5% na cidade A. Na linha
21 é realizado um incremento na variável qtde, ou seja, a cada repetição qtde = qtde + 1. Esta
variável possui a quantidade de anos em que B deverá alcançar A.

Figura 27 - resolução do exercício 03

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


90
aUTOaVALIAÇÃO
Após essa Aula, você consegue reconhecer a estrutura da tecnologia .NET?
Consegue revisar sobre lógica de programação utilizando a linguagem C#.?
Caso você consiga responder a essas questões, parabéns! Você atingiu os
objetivos específicos da Aula 2. Caso tenha dificuldades para responder
a algumas delas, aproveite para reler o conteúdo das Aulas, e acessar o
UNIARAXA Virtual e interagir com seus colegas, Tutor(a) e Professor(a). Você
não está sozinho nessa caminhada. Conte conosco!

RECAPITULANDO
Caro(a) Aluno(a), chegamos ao fim da nossa aula. Espero que tenha compreendido o conteúdo
e resolvido os exercícios propostos. Inicialmente estudamos sobre a estrutura da tecnologia
.NET, com objetivo de compreender como um programa é construído nesta plataforma. Nas
etapas seguintes, estudamos sobre a linguagem C#, tipos de dados e variáveis. Em seguida,
estudamos sobre comandos de entrada e saída, conversão de tipos de dados, comandos
condicionais e repetitivos.

Muito bem! Em nossa próxima Aula, vamos iniciar o estudo e desenvolvimento de programas
orientado a objetos.

E, aí, preparado(a) para mais uma jornada de conhecimento?

VIDEOAULA
Após a leitura e o estudo do seu livro-texto, chegou o momento de
complementar seu conhecimento. Vá até seu Ambiente Virtual
de Aprendizagem e acesse a Videoaula referente à Aula.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


91
REFERÊNCIAS
ASCENCIO, Ana Fernanda Gomes; DE CAMPOS, Edilene Aparecida Veneruchi. Fundamentos
da programação de computadores. Pearson Educación, 2008.

CAELUM, C# e Orientação a Objetos, Acesso: 01/01/2019. Disponível em: www.caelum.com.br.

DEITEL, Harvey M.; DEITEL, Paul J. C# Como Programar. 2003.

DEVMEDIA. Ferramentas além da IDE. Acesso: 11/03/2018. Disponível em: https://www.


devmedia.com.br/desenvolvimento-de-software-ferramentas-alem-da-ide-parte-1/21391

MANZANO, José Augusto N. G. Programação de computadores C#. São Paulo: Érica, 2014.

MICROSOFT, Tipos e Variáveis. Acesso: 11/03/2018. Disponível em: https://docs.microsoft.com/


pt-br/dotnet/csharp/tour-of-csharp

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


92
SUMÁRIO

AULA 3
Objetivos Específicos:

• Manipular strings.
• Trabalhar com listas e arrays.
• Desenvolver Projetos OO na linguagem C#.
• Estudar sobre a Manipulação dos tipos de dados.S

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


93
UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS
2
AULA 3 - DESENVOLVENDO SOFTWARE ORIENTADO
A OBJETOS - PARTE I
CONTEXTUALIZANDO A APRENDIZAGEM
Prezado(a) Aluno(a), na Aula anterior você estudou sobre a estrutura da linguagem C# e
realizou uma revisão sobre Lógica Computacional. Nessa aula, vamos estudar outras estruturas
da linguagem C# e aplicar os conceitos de programação orientada a objetos por meio do
desenvolvimento de programas.

Através dos estudos dessa Aula você será capaz de aplicar conceitos iniciais de Programação
Orientada a Objetos e entre outros conceitos e estruturas da linguagem C#. Você sabe
manipular strings e datas? Sabe criar e utilizar métodos? Nessa aula você terá a resposta para
essas e outras perguntas.

Então, é indispensável que você tente resolver todos os exercícios propostos.

Fique atento(a), pois as resoluções dos exercícios resolvidos estão disponíveis no AVA (Ambiente
Virtual de Aprendizado).

Espero que esteja curioso para iniciar no fantástico mundo da Programação Orientada a
Objetos!

Boa aula!

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


94
MAPA MENTAL PANORÂMICO
Para contextualizar e ajudá-lo(a) a obter uma visão panorâmica dos conteúdos que você
estudará na Aula 3, bem como entender a inter-relação entre eles, é importante que se atente
para o Mapa Mental, apresentado a seguir:

DESENVOLVENDO SOFTWARE
ORIENTADO A OBJETOS - PARTE I

VETORES DIMENSIONAIS

VARIÁVEL DO TIPO VAR

ARRAY
MULTIDIMENSIONAL COMANDO
CONDICIONAL COM
SWITCH CASE

OUTROS TÓPICOS SOBRE


C# EXPRESSÃO
CONDICIONAL TERNÁRIA

CRIANDO O PRIMEIRO TRABALHANDO COM


PROGRAMA EM C# STRING

CONCATENANDO
STRINGS C#

FORMATANDO VALORES
COM MÉTODO STRING.
FORMAT

TRABALHANDO COM
DATAS EM C#

ORGANIZANDO O
CLASSES E OBJETOS
CÓDIGO COMO CLASSE
MÉTODO SEM RETORNO E
SEM PARÂMETROS

CRIANDO E DEFININDO MÉTODO SEM RETORNO E


MÉTODOS COM PARÂMETROS
MÉTODOS
(COMPORTAMENTOS)
CRIANDO MÉTODOS NA MÉTODO COM RETORNO
PRÁTICA E COM PARÂMETROS

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


95
1. VETORES DIMENSIONAIS
Na aula anterior, você aprendeu como criar e utilizar tipos diferentes de variáveis. Mas todos
os exemplos de variáveis vistos, até agora, têm algo em comum: elas armazenam dados de
um único item (int, float, entre outros tipos). Então, imagine se você precisar armazenar um
conjunto de valores do mesmo tipo, por exemplo, a idade dos alunos que estão cursando essa
disciplina?

Para solucionar este problema, é possível desenvolver o exemplo apresentado na Figura 1.


Perceba que foi criada uma variável para cada valor, considerando que a disciplina possui
apenas três alunos matriculados. Note que, além de armazenar as idades, a média foi calculada.

Figura 1: Calculando média sem vetor (array).

Fonte: Elaborada pelo Autor.

Você deve ter percebido que, para realizar a média de 10 alunos utilizando a mesma estrutura
do Algoritmo da Figura 1, seria necessário adicionar mais sete variáveis e uma mensagem para
cada variável a ser preenchida pelo usuário.

Então, neste momento, temos alguns problemas:

• a quantidade de linhas de código para um problema relativamente simples aumentaria


consideravelmente;

• em toda alteração de quantidade de alunos seria necessário um aumento considerável


na quantidade de linhas de código.

Uma alternativa para melhorar o programa, apresentado na Figura 1, é a utilização de vetores


(Arrays), que é uma sequência não ordenada de elementos que precisam ter o mesmo tipo,
pois um array reside em um bloco contínuo da memória. Um array é a forma mais simples de
armazenar valores do mesmo tipo em uma mesma estrutura. Por exemplo, seria possível criar um
array com capacidade para armazenar 5 elementos do tipo int, para controlar a quantidade
de pessoas de cinco cidades. A Figura 2 ilustra a representação de um array com 5 posições.

Perceba que o array possui índice para que seja possível alterar ou selecionar cada valor dentro

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


96
de uma determinada posição. Por exemplo, para acessar o valor 12, seria necessário informar
o nome da variável que armazena o array e a posição (NomeArray[posição]).

Figura 2: exemplo da estrutura de um array.

Fonte: Elaborada pelo Autor.

O código a seguir representa a inserção dos valores no array da Figura 2. Perceba que
inicialmente, é criado um vetor (array) com 5 posições e, em seguida, são inseridos os valores
em cada posição.

Figura 3: Código de inserção dos valores array.

Fonte: Elaborada pelo Autor.

Vamos voltar ao nosso problema do cálculo da idade dos alunos da disciplina de POO.
Utilizaremos um vetor (array) para armazenar a idade de 10 alunos de uma determinada
disciplina. Diferente do exemplo apresentado anteriormente para inserir em um vetor (array)
de cinco posições. Neste exemplo, iremos otimizar o nosso código para tornar a resolução mais
dinâmica.

Figura 4: Armazenando valores no array.

Fonte: Elaborada pelo Autor.

No exemplo da Figura 4, foi criado um array com dez posições para armazenar os dados da

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


97
idade de 10 alunos, conforme apresentado a seguir:

• Na linha 14, é criado uma variável do tipo vetor (array), neste momento, a estrutura
ainda não foi criada, ou seja, foi criado apenas um ponteiro do tipo vetor (array).

• Na linha 15, o tamanho do vetor (array) é definido e um espaço na memória (heap) é


reservado para receber 10 valores do tipo int.

LEMBRE-SE!
Em relação ao heap, na Linguagem C#, existem dois “agrupamentos”
de tipos de dados. No primeiro grupo, são agrupados os tipos por
valor, onde o espaço reservado na memória (stack) é utilizado para
armazenar o valor. O segundo grupo é considerado de referência,
pois o endereço das variáveis na memória é utilizado para armazenar
o endereço onde os dados estão armazenados (heap). Para mais
detalhes, consulte a aula 02.

• Na linha 17, temos um comando repetitivo, com a variável i iniciando com valor 0 (i=0),
pois a primeira posição do vetor (array) é zero. Na mesma linha, a cada execução o i é
incrementado em uma unidade (i++) e um teste é realizado para analisar se chegou no
final do vetor (array) (i<A.Length). Lenght é uma propriedade do vetor que retorna o seu
tamanho. Então, como o índice começa na posição 0, a execução será até i ser igual
9, que representa a última posição do vetor (array).

LEMBRE-SE!
Caso esteja com dúvida em relação aos comandos repetitivos (for,
while e do while), seria interessante voltar na aula 02 e estudar os
exemplos apresentados.

• Na linha 19, é mostrada uma mensagem na tela para solicitar a inserção da idade dos
alunos.

• Na linha 20, é armazenado o valor na posição i do vetor A. Por exemplo, na primeira vez
que o comando de repetição for executado e considerando que a idade digitada será
33, a linha de código terá a seguinte estrutura: A[1] = 33.

• Na Linha 21, é armazenado o acumulado dos valores digitados.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


98
• Por fim, após a execução das linhas 19 a 21. Será apresentada uma mensagem com o
valor da média (Linha 23).

Você conseguiu analisar a diferença entre os exemplos da Figura 1 e 3? Note que, no exemplo
3, para alterar a quantidade de alunos seria necessário alterar apenas a linha 15 com a
quantidade de elementos do vetor, por exemplo, int[20]. Por outro lado, no exemplo da Figura
1, para armazenar 20 idades, seria necessário criar ao todo, 20 variáveis e 20 instruções para
receber os valores digitados pelo usuário. Então, é bem mais fácil utilizar o vetor (array), não é
verdade?

VAMOS PRATICAR?!
Desenvolva um programa utilizando a Linguagem C# para
armazenar em um array o salário de 12 meses de trabalho de uma
pessoa. No final, apresentar o valor da média na tela.

Ao final do seu livro-texto, você terá acesso à resposta desse


exercício.

2. ARRAY MULTIDIMENSIONAL
No exemplo explicado na Seção anterior, analisamos como criar um vetor (array). Entretanto,
é possível criar um array que possua mais de uma dimensão como, por exemplo, um array
com duas dimensões, que neste caso, é chamado de Matriz. A Figura 5 representa um array
(matriz) multidimensional com quatro linhas e três colunas. Para você acessar os elementos,
será necessário utilizar dois índices: o primeiro que define a linha e o segundo que define a
coluna.

Figura 5: Matriz (array) multidimensional.

Fonte: Elaborada pelo Autor.

O exemplo da Figura 6, representa uma estrutura utilizada para armazenar valor em um array

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


99
multidimensional que tenha quatro linhas e três colunas, conforme a Figura 5.

Figura 6: Exemplo utilizado para percorrer um array multidimensional.

Fonte: Elaborada pelo Autor.

O Exemplo (Figura 6) pode ser analisado de acordo com os seguintes itens:

• Na linha 14, é criado o array multidimensional com 4 linhas e 3 colunas.

• A linha 15 representa o comando de repetição utilizado para percorrer as linhas do


array.

• A linha 17 representa o comando de repetição utilizado para percorrer as colunas.

• As linhas 19 e 20 representam a mensagem e a leitura do valor digitado pelo usuário.

Note que, a diferença básica entre preencher os dados de um vetor (array) dimensional em
multidimensional está na quantidade de índices e nos comandos de repetição. No array
dimensional é preciso apenas de um comando de repetição. Já na matriz (array) com duas
dimensões (multidimensional) são necessários dois comandos de repetição aninhados. Ou
seja, precisaremos invocar um comando repeticional (for), que percorrerá as linhas e outro
comando repeticional (for), que percorrerá as colunas.

3. OUTROS TÓPICOS SOBRE C#


Nesta Seção, vamos estudar uma miscelânea de estruturas utilizadas na Linhagem C#. Fique
atento, pois é comum a utilização dessas estruturas em projetos de software.

3. 1 VARIÁVEL DO TIPO VAR


Na Linguagem C#, e possível você criar uma variável, sem se preocupar com seu tipo,
utilizando o comando var no lugar do tipo de dado da variável. O exemplo a seguir, representa
a utilização do var. Perceba que que a variável nome foi criada e no lugar do tipo foi utilizado
o comando var. Então, a partir do momento que o nome “Uniaraxá” foi atribuído para variável,
seu comportamento será idêntico a uma variável do tipo string.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


100
Figura 7: Variável do tipo var.

Fonte: Elaborada pelo Autor.

! FIQUE ATENTO!

Este tipo de declaração não pode ser criado como atributo de


uma classe e sempre que for criada, deve ser inicializada. Além
disso, não pode ser utilizado como parâmetro de métodos.

3.2 COMANDO CONDICIONAL COM SWITCH CASE


Na Aula 02, você teve contato com algumas estruturas de desvio condicional. Entre elas, você
estudou sobre desvio condicional estruturado, que pode ser utilizado para realizar vários testes,
dentro de uma mesma estrutura condicional.

Os dois exemplos (Figura 8) representam uma estrutura utilizando o if else estruturado e uma
alternativa similar, utilizando a estrutura switch case, que pode ser utilizada como alternativa do
desvio condicional estruturado.

Figura 8: Utilizando o switch case.

Fonte: Elaborada pelo Autor

Note que, no exemplo do switch case, a variável sexo é analisada em cada linha de instrução
case. E no final, caso nenhuma condição (case) seja verdadeira, a estrutura dentro do default
é executada.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


101
O comando switch é parecido com um conjunto de instruções IF sobre a mesma expressão.
Em alguns casos, pode ser necessário comparar a mesma variável (ou expressão) com muitos
valores diferentes, executando uma peça diferente do código dependendo de qual valor ele
se encaixar. Isto é exatamente o que a instrução switch faz.

3.3 EXPRESSÃO CONDICIONAL TERNÁRIA


Você precisa analisar uma condição para inserir um determinado valor em uma variável. Então,
seria necessário utilizar uma estrutura de desvio condicional para realizar este procedimento.
Entretanto, para resolver este problema, você pode utilizar a estrutura ternária.

valor = (condição) ? valor_se_verdadeiro : valor_se_falso;

O exemplo a seguir representa a utilização de uma estrutura ternária. No exemplo, após o


usuário digitar o valor, é realizado uma análise e o valor “PODE PARTICIPAR” é armazenado na
variável situacao, caso a idade seja maior ou igual a 18, caso contrário, será armazenado o
texto “NÃO PODE PARTICIPAR”.

Figura 9: Utilizando o condicional ternário.

Fonte: Elaborada pelo Autor.

O código a seguir, representa a estrutura condicional idêntica ao exemplo anterior. Neste


exemplo, é realizado o teste utilizando o desvio condicional composto.

Figura 10: Desvio condicional composto.

Fonte: Elaborada pelo Autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


102
3.4 TRABALHANDO COM STRING
Na linguagem C#, existem métodos e funções que podem ser utilizadas para manipular
variáveis do tipo string (textos). Por exemplo, seria possível alterar um determinado caractere
ou parte do conteúdo de uma variável por outro conteúdo.

Figura 11: Exemplo de manipulação de string.

Fonte: Elaborada pelo Autor.

O programa da Figura 11, representa alguns comandos de manipulação de string com a


seguinte estrutura:

• Na linha 17, o comando replace realiza a troca do termo “CSHARP” por “C#”. Este
comando pode ser utilizado para substituir um caractere ou uma coleção de caracteres
de uma string. Se você realizar um replace para substituir uma determinada letra, todas
as letras da string serão substituídas.

• Nas linhas 20 e 23, são utilizados os comandos ToUpper e ToLower que alteram todo o
texto para minúsculo e maiúsculo.

• Na linha 26, o comando IndexOf procura a posição da string que está a primeira ocorrência
do caractere “#”. Vale relembrar que, uma variável do tipo string é armazenada em
uma estrutura de vetor (array) de uma dimensão.

• Na linha 29, o comando Substring recortou parte do conteúdo, ou seja, todo o texto a
partir da posição 2 foi recortado e o restante foi descartado.

• Diferente da linha 29, no comando Substring utilizado na linha 32, foi definida a posição
inicial que deve ser recortada a string e quantas posições serão recortadas a partir da
posição inicial.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


103
VAMOS PRATICAR?!
Exercício Resolvido 2:

Crie um projeto em C# que receberá como entrada o um nome.


Após o nome ser digitado, alterar todos os caracteres para letra
maiúscula e apresentar apenas o primeiro nome na tela. Exemplo:
Se o usuário digitar “Pedro Araxaense da Silva” o nome deve ser
alterado para “PEDRO ARAXAENSE DA SILVA”. Mostrar apenas
“PEDRO” na tela.

Ao final do seu livro-texto, você terá acesso à resposta desse


exercício.

3.5 CONCATENANDO STRINGS C#


Em certas situações, é necessário unir (concatenar) dois valores distintos. A concatenação
é realizada entre dois elementos do tipo string (texto). Então, a concatenação pode ser
considerada o processo de acrescentar uma cadeia de caracteres ao final de outra cadeia
de caracteres.

Você pode concatenar cadeias de caracteres usando o operador + para concatenar literais
de cadeia de caracteres e constantes de cadeia de caracteres. A concatenação de literais
ocorre em tempo de compilação, ou seja, não ocorre nenhuma concatenação de tempo de
execução. Por outro lado, para variáveis de cadeia de caracteres, a concatenação ocorre
somente em tempo de execução (MICROSOFT, 2019).

Perceba que, no exemplo (Figura 12), é utilizada a concatenação para dividir um literal de
cadeia de caracteres ao longo código, em cadeias de caracteres menores, a fim de melhorar
a legibilidade no código-fonte. Essas partes são concatenadas em uma única cadeia de
caracteres em tempo de compilação. Note que, o valor apresentado contém todo o literal
que foi concatenado.

Figura 12: Concatenação de Literal.

Fonte: Elaborada pelo Autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


104
Para você concatenar variáveis de cadeia de caracteres, você pode utilizar os operadores
+ ou +=, a interpolação de cadeia de caracteres String.Format, String.Concat, String.Join ou
StringBulderAppend (MICROSOFT,2019).

A concatenação utilizando o + é a forma mais fácil e intuitiva. O exemplo (Figura 13),


representa a concatenação da data atual e um texto. Perceba que no exemplo, realizamos a
concatenação da data atual armazenada em uma variável e um texto pré-definido. Entretanto,
a concatenação poderia ser realizada entre duas variáveis, desde que sejam do tipo string.

Figura 13: Concatenação de variáveis com operador +.

Fonte: Elaborada pelo Autor.

Agora vamos aprender a utilizar a interpolação de cadeia de caracteres. O exemplo (Figura


14) é idêntico ao anterior, porém, no lugar do operador + foi utilizado a interpolação. Note que,
o nome da variável foi adicionado no texto entre {}. Ao adicionar o símbolo $ antes da cadeia
de caracteres, o compilador compreendeu que o que está entre {} deve ser identificado como
uma variável e concatenado com a cadeia de caracteres.

Figura 14: Concatenação com interpolação.

Fonte: Elaborada pelo Autor.

Outro método para concatenar cadeias de caracteres é o String.Format. Esse método funciona
bem quando você está criando uma cadeia de caracteres com base em um pequeno
número de cadeias de caracteres. O exemplo (Figura 15), representa a utilização deste tipo
de concatenação. Note que o valor {0} foi substituído pela data atual, e o valor {1} por Brasil.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


105
Figura 15: Concatenação com String.Format.

Fonte: Elaborada pelo Autor.

saiba mais!
Você acabou de conhecer várias formas de realizar a concatenação. Entretanto, além
dos tipos apresentados nesta aula, existem outros tipos que podem ser visualizados
clicando aqui.

3.6 FORMATANDO VALORES COM MÉTODO STRING.FORMAT


Formatação é o processo de conversão de uma instância de classe, estrutura ou valor de
enumeração em sua representação de cadeia de caracteres, de forma que a cadeia de
caracteres resultante possa ser exibida aos usuários ou pode ser restaurada o tipo de dados
original. Uma das formas de formatação utilizadas na linguagem C# é a utilização do método
String.Format (MICROSOFT, 2019). Lembre-se que na Seção anterior, o String.Format foi utilizado
para concatenar valores. Mas além de concatenar é possível formatar os valores.

Figura 16: Alguns exemplos do String.Format.

Fonte: Elaborada pelo Autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


106
A estrutura do Exemplo (Figura 16) representa alguns exemplos da utilização do String.Format:

• Nas linhas 13 e 14, são criadas as variáveis que serão utilizadas. A variável valor é tipo
decimal e recebe um número com 3 casas decimais (23.367), perceba que o separador
decimal é o ponto e não a vírgula.

• Nas linhas 16 e 17, a variável mensagem recebe a concatenação de um texto e o


conteúdo da variável valor, em seguida, o resultado é mostrado na tela.

• Na linha 19, ao utilizar {0:C2}, o valor 23.367 é formatado para o valor da moeda corrente
e arredondado para duas casas decimais (23.37). A letra C define que o valor deve ser
formado com símbolo da moeda corrente do sistema operacional, e o número 2 define
a quantidade de casas decimais.

• Na linha 22, ao utilizar o {0:N1}, o valor 23.367 é arredondado para uma casa decimal
(23.4). Se fossem duas casas decimais, a expressão seria {0:N2}.

• Na Linha 25, ao utilizar {0:d} é mostrado apenas a data do Data.Now(momento atual), e


{0:t} apresenta apenas a hora.

saiba mais!
Estes foram apenas alguns exemplos do String.Format. Você pode acessar o site da
Microsoft e conhecer outros exemplos de utilização do String.Format. Acesse clicando
aqui.

3.7 TRABALHANDO COM DATAS EM C#


Como já estudamos, na programação, existem variáveis de tipos distintos para controlar e
armazenar dados. Um dos principais tipos utilizado na linguagem C# é o DateTime, que
representa um momento no tempo, geralmente expresso como uma data e hora do dia.

Antes de começar a explicar sobre DateTime, vamos aprender como este tipo é controlado
e armazenado na memória. Na linguagem C#, uma data e hora é expressada no número de
intervalo de 100 nanossegundos decorridos desde do 1º de janeiro, do ano 0001 em 00:00:00.0000
no calendário gregoriano. Então, cada Tick equivale a 100 nanossegundos. No exemplo (Figura
17), apresenta na tela uma data e seu número em ticks.

Neste momento, você está preocupado(a) e com a seguinte dúvida: será que vou precisar
conhecer como ticks é convertido em data? Claro que não, pois o tipo DataTime possui
métodos que realizam este procedimento para facilitar a nossa vida.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


107
Figura 17: Imprimir data e ticks.

Fonte: Elaborada pelo Autor.

Para criar um objeto do tipo data é possível instanciar uma data utilizando alguns métodos
construtores. O exemplo (Figura 18), apresenta três exemplos de criação de datas. Na variável
data1, adicionamos a data 14/01/2014. Na variável data2, foi adicionado a hora, minutos e
segundos. Na variável data3, foi adicionado os milésimos de segundo.

importante

Os métodos construtores serão abordados detalhadamente,


mais adiante. Mas nesse momento, pense que são métodos
(comportamentos) que podem ou não serem executados toda
vez que um objeto é criado a partir de uma classe.

Figura 18: Exemplo de instanciação de objetos data.

Fonte: Elaborada pelo Autor.

Outra característica importante do tipo DateTime é a possibilidade de utilizar alguns atributos


pré-definidos. No exemplo (Figura 19), é possível pegar o momento atual (Now), a data atual
(Today) e horário UTC (UtcNow).

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


108
Figura 19 - exemplo de tipos de datas pré-definidas.

Fonte: Elaborada pelo Autor.

O Tempo Universal Coordenado (do inglês Universal Time Coordinated) é o fuso horário de
referência, a partir do qual, se calculam todas as outras zonas horárias do mundo. Por exemplo,
note que a data1 é diferente da data3, pois o fuso horário de Brasília possui três horas de
diferença em relação ao horário UTC.

DICA DO AUTOR
Se for desenvolver um software com acesso mundial, seria importante que a data
fosse armazenada e manipulada como UTC. Pois, para descobrir o horário atual,
seria necessário apenas, converter com base no fuso horário.

É possível utilizar outras estruturas disponíveis no objeto DateTime. Por exemplo, é possível
imprimir na tela, apenas parte de uma data. É possível adicionar uma quantidade de dias,
anos ou meses em uma data. O exemplo (Figura 20), representa alguns desses comandos.

Figura 20: Exemplo de manipulação de datas.

Fonte: Elaborada pelo Autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


109
saiba mais!
Estudamos neste momento, os principais elementos do tipo DateTime. Caso esteja
interessado em aprofundar no assunto, clique aqui.

LEMBRE-SE!
Até o momento, abordamos conceitos importantes para te auxiliar a
compreender a estrutura e outros conceitos relacionados à linguagem
de programação C#. A partir de agora, vamos iniciar nossos estudos
relacionados à Programação Orientada a Objetos. Claro, utilizando a
linguagem C#, pois você já está preparado(a)!

4. CLASSES E OBJETOS
Até o momento, todos os exemplos foram desenvolvidos apenas com a utilização da classe
program, sem pensar em programação orientada a objetos. Então, chegou o momento tão
esperado! Vamos aprender sobre os conceitos de programação orientada a objetos na prática.

Inicialmente, vamos relembrar o que é classe e objeto para iniciarmos o desenvolvimento dos
nossos primeiros programas em POO.

Quadro 1: Relembrando o que é classe e objeto.

Relembrando o que é classe e objeto


Objetos podem ser categorizados e uma classe descreve, de uma maneira abstrata, todos
os objetos de um tipo em particular. Por exemplo, considere que você deseja modelar uma
simulação de tráfego. Neste momento, você possui alguns objetos do tipo carro. Então, neste
contexto, carro seria uma classe ou um objeto? Algumas perguntas podem nos ajudar a
responder:
- De que cor é o carro? Que velocidade ele pode alcançar? Quantas pessoas podem ocupar
este carro?
Você notará que não podemos responder a essas perguntas, a não ser que seja um carro
específico. A razão é que a palavra “carro”, neste contexto, refere-se a classe carro, pois
estamos falando carro no geral e não em um carro específico. Agora, se você relatar que o
seu carro está no estacionamento, podemos responder às perguntas acima, pois você sabe
a cor, a velocidade máxima e a capacidade de pessoas. Neste momento, você pode definir
que o seu carro é um objeto da classe carro.
Resumindo: objetos correspondem a elementos da vida real e classes agrupam esses objetos.
Fonte: Elaborada pelo Autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


110
4.1 ORGANIZANDO O CÓDIGO COMO CLASSE
Conta bancária

Você precisa controlar as contas bancárias de uma instituição financeira, então, inicialmente,
você precisa definir o que será armazenado para que seja necessário controlar os dados da
conta bancária.

Vamos lá!!!! Crie um projeto no Visual Studio do tipo Visual C# e Console Application (.Net
Framework), chamado ContaBancaria 1. Em seguida, entre no menu Projeto (Project) e
adicione (Add) uma nova classe. Esta nova classe terá o nome de Conta. A estrutura da classe
é apresentada na Figura 21.

Figura 21: Exemplo da classe Conta.

Fonte: Elaborada pelo Autor.

A estrutura da classe conta (Figura 21) pode ser compreendida como:

• Entre as linhas 1 e 5, são declaramos os namespaces que podem ser utilizados na classe.
Dentro de cada namespace, pode existir um conjunto de funcionalidades pré-definidas
que podem ser utilizadas pela classe. Na prática, seria uma forma de deixar transparente
o seu uso dentro do contexto. Resumidamente, namespace podem ser consideradas
bibliotecas com estruturas pré-definidas.

• Na linha 7, é definido o namespace da classe Conta. Isto seria uma forma de organizar
as classes que pertencem a um mesmo domínio. Por exemplo, todas as classes que
realizaram o controle de transações bancárias poderiam ter um namespace único com
a declaração namespace Financeiro.

• Na linha 9, é definido o nome da classe.

• E por fim, tudo que estiver entre as chaves da linha 10 e 11 fazem parte do escopo da
classe, ou seja, da sua estrutura.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


111
EXEMPLIFICANDO

Para realizar a maioria dos cálculos básicos de matemática, você


pode declarar o namespace System. Para calcular a raiz quadrada
de um número, basta utilizar o método Math.Sqrt. O exemplo a seguir
mostra a raiz de 81 na tela. Se o namespace System for retirado, o
Math.Sqrt não será localizado.
Figura 22: Método Math.Sqrt.

Fonte: Elaborada pelo Autor.

Para controlarmos uma conta bancária, é preciso armazenar e controlar alguns dados, como:
saldo, titular da conta e número da conta. Então, perceba que esses itens podem ser criados
com a utilização de variáveis, que são conhecidas como atributos de classe. O exemplo (Figura
23) representa a criação da classe e seus atributos.

Figura 23: Atributos de classe.

Fonte: Elaborada pelo Autor.

importante

A propriedade de visibilidade public foi utilizada, entretanto


seu conceito será relembrado mais adiante. Neste momento,
considere que public define que um atributo de classe ou
método pode ser acessado por classes externas.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


112
Perceba que no exemplo (Figura 23), foram adicionados valores para os atributos (variáveis
da classe). Entretanto, em um software real os valores seriam preenchidos com dados de um
repositório ou inseridos pelo usuário.

Até o momento, temos duas classes em nosso projeto Conta Bancária. A classe Program que
foi criada automaticamente e será a primeira a ser criada e a classe Conta que criamos. Então,
vamos analisar como uma classe pode se relacionar com outra classe. Lembre-se que foi criada
uma classe e não um objeto. Então, para criar um objeto é necessário criar uma instância da
classe Conta e dar um nome para esta instância (objeto).

Figura 24: Criando um objeto da classe conta.

Fonte: Elaborado pelo Autor.

A estrutura do exemplo (Figura 24) pode ser compreendida como:d

• Na linha 13, foi criada uma instância da classe Conta com nome contabancaria, ou seja,
foi criado um objeto da Classe conta com nome contabancaria. Neste momento, você
percebe que uma das formas de criar uma instância de uma classe é: NomeClasse
nomeobjeto = new NomeClasse ();

• Nas linhas 14, 15 e 16, os valores da classe são alterados. Perceba que, para acessar os
valores da classe, foi necessário utilizar o ponto(.). Por exemplo, para acessar e alterar o
saldo, foi necessário colocar a linha de código: contabancaria.saldo = 1500;. Isto é um
conceito importante de Programação Orientada a Objetos, pois para acessar qualquer
estrutura de objeto é necessário utilizar o ponto(.).

! FIQUE ATENTO!

As ferramentas de desenvolvimento geralmente possuem


uma característica chamada intellisense, que auxilia no
desenvolvimento, pois quando pressionamos ponto após o

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


113
nome do objeto é apresentado na tela os métodos e atributos
de classe do objeto.
Figura 25: Característica intellisense.

Fonte: Elaborado pelo Autor.

VAMOS PRATICAR?!
Exercício Resolvido 3:

De acordo com diagrama de classe da Figura 26, crie um


Programa C# Console Application. No método Main da classe
Program deve ter uma instância da classe Aluno, os dados do
aluno serão digitados e apresentados na tela. Os atributos da
classe Aluno possuem a visibilidade pública (public). Note que a
classe Program é criada quando criamos o projeto, então, ela foi
adicionada no diagrama para auxiliar a representar a relação
entre as duas classes.

Figura 26: Diagrama de classe do exercício 03.

Fonte: Elaborada pelo Autor.

Ao final do seu livro-texto, você terá acesso à resposta dess


exercício.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


114
5. MÉTODOS (COMPORTAMENTOS)
Fantástico! Como você já teve contato com criação de classes, agora vamos aprender como
criar métodos (comportamentos) de uma classe.

Enquanto as variáveis armazenam dados referentes aos objetos, os métodos podem realizar
operações com essas variáveis ou operações internas.

Um método é um trecho de código independente de qualquer parte do programa, porém,


relacionado às funcionalidades propostas dentro do programa e classe. Ou seja, os métodos
são um conjunto de instruções que efetuam uma tarefa específica.

De forma geral, os métodos podem (ou não) receber valores de entrada que podem ser
opcionais e que são chamados de parâmetros dos métodos. Além disso, em algumas situações
um método pode gerar um valor de saída (retorno) (MANZANO, 2014).

Lembre-se que, utilizar métodos pode tornar o trabalho de desenvolvimento mais versátil, pois:

• é possível dividir uma classe em pequenas partes (métodos) e com características que
possam ser reutilizadas várias partes do programa (MANZANO, 2014);

• o desenvolvedor tem a liberdade de criar os seus próprios métodos, tornando a


programação mais eficiente, pois é possível reaproveitar os códigos que já foram
testados e utilizados (MANZANO, 2014);

• pode auxiliar a dividir um problema complexo em pequenas partes, pois, dessa forma,
cada parte menor terá um algoritmo simples (MANZANO,2014).

5.1 CRIANDO E DEFININDO MÉTODOS


Existem várias formas de criar um método, seja relacionado ao tipo de retorno, na estrutura dos
parâmetros e tipo de visibilidade. A sintaxe de criação de um método na linguagem C# pode
ser definido como:

<qualificador> <tipo> <nomedométodo> ([Parâmetros]) {

<corpo>;

Cada item da sintaxe acima pode ser definido como:

• qualificador: é uma palavra reservada da linguagem C#, que define a visibilidade de


um determinado atributo, método ou objeto. Os principais qualificadores são: public

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


115
que define que qualquer classe externa terá acesso, private que define que nenhuma
classe externa terá acesso, protected que define que apenas a classe (superclasse) e
suas classes filhas (subclasse) terão acesso (MANZANO,2014). Como complementação
do qualificador em uso, utiliza-se uma segunda cláusula opcional, denominada static,
que tem por finalidade indicar que o atributo, método, objeto ou variável pertence à
classe a ele associada.

• tipo: é o tipo de dado de retorno do método após sua execução. Pode ser o nome de um
tipo primitivo da linguagem como: int, float, double, string, long, byte, entre outros. Se o
método não for retornar valor, deve-se usar a palavra reservada void (MANZANO,2014).

• nome: é o nome com o qual o método será chamado. Como boa prática, você deve
adicionar um nome que ajude a compreender sua finalidade, por exemplo, se for criar
um método para calcular uma soma, seu nome seria CalcularSoma().

• corpo: é o código que executa a ação do método. Note que, em vários exemplos,
implementamos o corpo do Método Main() da classe Program.

5.1.1 MÉTODO SEM RETORNO E SEM PARÂMETROS


Um método sem retorno é definido com o tipo void. Este método não retorna nenhum valor
válido para estrutura que foi responsável por chamá-lo. Considere que este método precisa
apenas avisar a estrutura, que foi responsável por executá-lo que sua execução foi finalizada.
No exemplo (Figura 27), foi criado um método na classe Program com a responsabilidade de
mostrar uma mensagem na tela.

Figura 27 - Exemplo de método sem retorno.

Fonte: Elaborada pelo Autor.

Note que o exemplo da Figura 27 possui as seguintes características:

• Todo o conteúdo entre as linhas 17 e 20 pertencem ao corpo (conteúdo) do método


MostrarMensagem().

• Como o método Main() é o primeiro ser executado, ao passar pela linha 13 o método

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


116
MostrarMensagem() é executado e a mensagem é apresentada na tela.

• O static nos dois métodos define que método é da classe e não de objeto. Veremos este
conceito com maiores detalhes mais adiante, na disciplina.

5.1.2 MÉTODO SEM RETORNO E COM PARÂMETROS


O método do tipo void (sem torno) pode receber parâmetros na sua assinatura. O exemplo
(Figura 28), possui um método chamado CalcularSoma, que precisa receber dois valores do
tipo int. Após receber os valores, é apresentada a soma na tela.

Figura 28: Exemplo de método sem retorno com parâmetros.

Fonte: Elaborada pelo Autor.

Note que o exemplo da Figura 28 possui as seguintes características:

• Na linha 17, é definido o nome do método e a quantidade e tipos de parâmetros que


ele precisa receber. Neste exemplo, ele precisa de dois parâmetros do tipo int.

• Na linha 14, o método é executado, passando como parâmetro, os valores 10 e 20.

• O conteúdo entre as linhas 18 e 22 representa o corpo do método, que são responsáveis


por calcular, armazenar a soma e apresentar o resultado na tela.

5.1.3 MÉTODO COM RETORNO E COM PARÂMETROS


Ao contrário do método sem retorno, o método com retorno retorna um resultado válido. Pode
ser um resultado do tipo int, string, bool ou até, um tipo complexo. Vale ressaltar que no tipo
complexo é retornado o endereço (ponteiro) e não os valores.

O exemplo (Figura 29), possui o mesmo resultado do exemplo apresentado na Figura 28.
Entretanto, neste exemplo, o método retorna o resultado e a responsabilidade de mostrar na
tela é o método Main().

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


117
Figura 29: Exemplo de método com retorno com parâmetros.

Fonte: Elaborada pelo Autor.

Note que, o exemplo da Figura 29 possui as seguintes características:

• Na linha 19, ao substituir o void pelo int, define que o método deve retornar um valor um
número inteiro (int).

• A linha 22, é a definição do retorno do método. Neste exemplo, é retornado a soma de


A + B que está armazenado em R.

• Na linha 14, é criada uma variável do tipo int para receber o resultado que for retornado
pelo método CalcularSoma. Note que, nesta mesma linha, é passado como parâmetro
dos métodos CalcularSoma, os valores 10 e 20.

• As Linhas 15 e 16, são responsáveis por mostrar o valor na tela e pausar a tela até que
uma tecla seja pressionada.

Note que, neste exemplo (Figura 29), a responsabilidade de imprimir os valores foi do método
Main(). Além disso, não é necessário utilizar a variável resultado, pois seria possível atribuir o
nome da função na linha 15, conforme o exemplo:

5.2 CRIANDO MÉTODOS NA PRÁTICA


Agora que você já estudou e aprendeu sobre criação de métodos, vamos alterar o nosso
exemplo da classe Conta e criar alguns métodos para definir alguns comportamentos. Então,
pense quais seriam os principais comportamentos da classe Conta em um banco?

O primeiro comportamento está relacionado a possibilidade de efetuar um depósito na

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


118
conta. Para realizar este comportamento, seria necessário criar um método para executar este
procedimento. Note que, no exemplo (Figura 30), foi criado um método com nome ‘Depositar”
que precisa receber como parâmetro o valor a ser depositado. A estrutura entre as linhas 16 e
18 define o corpo do método.

Figura 30: Exemplo de método com retorno com parâmetros.

Fonte: Elaborada pelo Autor.

Para utilizar a classe e o método criado no exemplo anterior (Figura 30), é necessário criar um
objeto da classe “Conta” e realizar os passos, conforme o exemplo apresentado na Figura 31.

Figura 31: Realizando o depósito.

Fonte: Elaborada pelo Autor.

O exemplo da Figura 31, utiliza a classe Program e o método Main() para criar uma objeto
(instância) da classe Conta e suas características são:

• Na linha 13, é criado uma variável para receber o valor que será depositado.

• Na linha 14, é criado um objeto denominado contabancaria que é uma instância da


classe conta.

• Entre as linhas 15 e 17, são armazenados os valores da classe. Note que estes valores

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


119
podem ser digitados pelo usuário ou pesquisados em uma base de dados.

• Na Linha 18, é apresentado o saldo atual. Que neste exemplo é 1500.

• Nas linhas 20 e 21, é mostrada a mensagem para o usuário inserir o valor do depósito.

• Na linha 23, o método Depositar dos objetos contabancaria é executado passando


como parâmetro, o valor digitado pelo usuário e armazenado na variável valordepositar.
Neste momento, o corpo do método Depositar é executado e o saldo é aumentado
com o valor da variável valordepositar. Por exemplo, se o valor depositar for 500,00, o
saldo final será 2.000.

• Na linha 25, é apresentado o resultado do saldo final após o depósito.

VAMOS PRATICAR?!
Parabéns!!! Você já sabe criar classes, instanciar objetos e criar
métodos. Então, para finalizar esta aula e para te auxiliar na Aula
03, a seguir é proposto um exercício relacionado à criação de
métodos. Vamos lá, você consegue!

Exercício Resolvido 4:
Utilizando a estrutura da classe “Conta Bancária”, acrescente um
método para realizar um Saque na conta e simule este saque,
utilizando uma instância da classe conta na classe “Program”.
Entretanto, antes de realizar o saque, verifique se existe saldo
disponível.

CONECTANDO

Para que você tenha sucesso na área de desenvolvimento de software é indispensável


que você tenha compreendido os conceitos de instância (objeto), classe e método.
Além disso, este conteúdo será abordado em outras disciplinas que trabalham com
desenvolvimento de produtos de software.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


120
aUTOaVALIAÇÃO
Após essa aula, você é capaz de manipular string e datas? É capaz de criar
classes e métodos? Consegue desenvolver um programa simples utilizando a
linguagem C# com conceitos de programação orientada a objetos? Caso
você consiga responder estas questões, parabéns! Você atingiu os objetivos
específicos da Aula 3! Caso tenha dificuldades para responder alguma(s)
dela(s), aproveite para reler o conteúdo da Aula, acessar o UNIARAXÁ Virtual
e interagir com seus colegas e com o(a) tutor(a) e esclarecer todas as suas
dúvidas. Você não está sozinho nessa caminhada! Conte conosco!

RECAPITULANDO
Caro(a) Aluno(a), chegamos ao fim da nossa aula. Espero que tenha compreendido o conteúdo
e resolvido os exercícios. Inicialmente, estudamos sobre array e uma miscelânea de estruturas
que são utilizadas na linguagem C#. Em seguida, foi apresentado como classes e objetos são
criados. E por fim, aprendemos a criar métodos (comportamentos) nas classes.

Muito bem! Em nossa próxima Aula, vamos continuar nosso estudo sobre Programação
Orientada a Objetos, com ênfase no desenvolvimento de programas com várias classes,
utilização de herança, properties, encapsulamento e outras estruturas.

E, aí, preparado(a) para mais uma jornada de conhecimento?

VIDEOAULA
Após a leitura e o estudo do seu livro-texto, chegou o momento de
complementar seu conhecimento. Vá até seu Ambiente Virtual
de Aprendizagem e acesse a Videoaula referente à Aula.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


121
FOLHA DE RESPOSTAS
Exercício 1:

Figura 32: Resolução exercício 01.

Fonte: Elaborada pelo Autor.

Exercício 2:

Figura 33: Resolução exercício 02.

Fonte: Elaborada pelo Autor.

Exercício 3:

Figura 34: Resolução exercício 03 (classe Aluno).

Fonte: Elaborada pelo Autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


122
Figura 35: Resolução exercício 03 (classe Program).

Fonte: Elaborada pelo Autor.

Exercício 4:

Figura 36: Resolução exercício 04 (classe Conta).

Fonte: Elaborada pelo Autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


123
Figura 37: Resolução exercício 04 (classe Program).

Fonte: Elaborada pelo Autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


124
REFERÊNCIAS
ASCENCIO, Ana Fernanda Gomes; DE CAMPOS, Edilene Aparecida Veneruchi. Fundamentos
da programação de computadores. Pearson Educación, 2008.

DEITEL, H.; DEITEL, P.; STEINBUHLER, K. C# Como Programar. 1. ed. São Paulo: Pearson, 2003.

MANZANO, José Augusto N. G. Programação de computadores C#. São Paulo: Érica, 2014.

MICROSOFT. Disponível em: <https://docs.microsoft.com/pt-br>. Acesso em 14 de abr. 2019.

SHARP, John; MANIEZ, Dominique. Visual C# 2010. Microsoft Press, 2010. Porto Alegre:
Bookman, 2011.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


125
SUMÁRIO

AULA 4
Objetivos Específicos:

• Desenvolver e aplicar os conceitos de herança.


• Desenvolver e aplicar os conceitos de métodos construtores.
• Aplicar os conceitos de encapsulamento.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


126
UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS
2
AULA 4 - DESENVOLVIMENTO DE SOFTWARE
ORIENTADO A OBJETOS - PARTE II
CONTEXTUALIZANDO A APRENDIZAGEM
Prezado(a) aluno(a), na Aula anterior, você estudou sobre a estrutura da linguagem C# e iniciou
os primeiros passos na programação orientada a objetos. Nessa aula, vamos estudar outras
estruturas da linguagem C# e aplicar outros conceitos de programação orientada a objetos
por meio do desenvolvimento de programas e estudo da teoria e suas aplicações. Você sabe
criar métodos? Consegue aplicar reusabilidade no desenvolvimento de software? Consegue
encapsular objetos? Nessa aula você terá as respostas para essas e outras perguntas.

! FIQUE ATENTO!

Fique atento(a), pois a resolução dos exercícios resolvidos,


estão disponíveis no AVA (Ambiente Virtual de Aprendizado).

Boa aula!

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


127
MAPA MENTAL PANORÂMICO
Para contextualizar e ajudá-lo(a) a obter uma visão panorâmica dos conteúdos que você
estudará na Aula 4, bem como entender a inter-relação entre eles, é importante que se atente
para o Mapa Mental, apresentado a seguir:

PROJETOS POO E CONCEITOS

ENCAPSULAMENTO E
MODIFICADORES DE
ACESSO

ENCAPSULAMENTO

ACESSO POR
PROPRIEDADES

TODOS OS NÍVEIS DE
ACESSIBILIDADE NA
PROJETOS POO E LINGUAGEM C#
CONCEITOS
MÉTODO CONSTRUTOR

TRABALHANDO COM
HERANÇA

MÉTODOS E CLASSES
ABSTRATAS

CLASSE COMO ATRIBUTO

PASCAL CASE

ORGANIZANDO MEU CAMEL CASE


CÓDIGO

CONVENÇÕES DO .NET

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


128
1 - PROJETOS POO E CONCEITOS
Até o momento, você desenvolveu programas orientados a objetos (POO) utilizando apenas
duas classes e com métodos com baixa complexidade. A partir desta aula, vamos trabalhar
com outras estruturas relacionadas com classes e com a aplicação prática de vários conceitos
da Programação Orientada a Objetos.

1.1 ENCAPSULAMENTO E MODIFICADORES DE ACESSO


Lembra da Classe Conta que utilizamos na aula passada? Vamos relembrar!

Criamos uma classe Conta para controlar o saldo e os dados do titular da conta. Além disso,
implementamos um método para realizar Depósito (Figura 1)

Figura 1 - Classe Conta

Fonte: Elaborada pelo Autor

E para simular um depósito utilizando o método Depositar, criamos uma estrutura na classe
Program que recebe como entrada o valor a ser depositado. O exemplo (Figura 2), representa
a classe Program.

Figura 2 - Realizando um depósito

Fonte: Elaborada pelo Autor

Agora, imagine que durante o desenvolvimento, ao utilizar a classe Conta, o desenvolvedor

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


129
por engano adicione o seguinte código na classe Program:

Neste momento, você percebe que existe um problema, pois em qualquer parte do software
que tenha acesso a classe Conta será possível acessar e alterar o saldo sem a necessidade de
utilizar o método depositar. Sabe por que isto aconte? Porque o tipo de visibilidade do atributo
da classe Conta é público (public), que permite que qualquer classe possa alterar ou modificar
o seu valor, sem a necessidade da utilização de um método. Contudo, para alterar o saldo,
o correto seria a utilização de um método Depositar (Figura 1) e para diminuir o saldo seria
necessário criar um método Sacar.

Preocupado(a)? Fique tranquilo(a)! Pois este problema pode ser solucionado com a utilização
do encapsulamento que será abordado a seguir.

1.2 ENCAPSULAMENTO
Como estudamos na primeira Aula, o encapsulamento é um dos pilares da programação
orientada a objetos e está relacionado a segurança dos objetos de uma classe. Uma das
aplicações do encapsulamento está relacionada à necessidade de esconder recursos,
protegendo-os ou privando-os em relação ao seu uso. O encapsulamento proporciona
estabelecer o conjunto de recursos que podem ser visíveis ou invisíveis, os quais são definidos
pelos qualificadores básicos public, private e protected.

importante

Na linguagem C# existem outros qualificadores específicos da


sua arquitetura e que serão abordados mais adiante.

Vamos voltar ao Projeto de Conta Bancária. Quando liberamos o acesso aos atributos da classe
Conta, foi permitido que qualquer desenvolvedor alterasse os valores utilizando sua própria
regra ou lógica. Mas por segurança, o correto seria a implementação de restrições para que o
valor do saldo fosse alterado somente por meio de métodos. Ao implementar esta regra, seria
possível garantir a integridade dos dados e como resultado, teríamos uma maior segurança na
codificação.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


130
Então, vamos lá! Para solucionar este problema, basta alterar o identificador de visibilidade
do atributo Saldo para private, conforme a seguir. Lembre-se que o identificador private
define que o atributo de classe somente poderá ser acessado dentro da própria classe.

! FIQUE ATENTO!

Na linguagem C# quando um atributo não possui um


identificador de acesso definido, ele será automaticamente do
tipo private. Exemplo: (double valor;) e (private double valor;)
possuem a visibilidade private.

Conforme o exemplo anterior, foi definido que, para alterar o saldo será necessário utilizar os
métodos da classe, por exemplo, para depositar um valor, seria necessário utilizar o método
Depositar.

Acabamos de resolver um problema, porém, outro problema foi gerado, pois em algumas
situações, precisamos acessar o valor de um atributo de classe. Por exemplo, ao alterar o
atributo Saldo para private, a linha linha 21, no exemplo da Figura 02 não funcionaria, pois o
private define um bloqueio tanto para alterações quanto para leitura. Então, não seria possível
imprimir o valor do saldo.

Felizmente, para solucionar este problema é possível definir métodos Get e Set ou utilizar uma
propriedade, que é uma característica muito utilizada na linguagem C#, para definir níveis de
acesso diferentes, tanto para leitura (get) ou para alteração (set). A seguir, vamos aprender a
utilizar as propriedades da linguagem C# no Projeto Conta.

LEMBRE-SE!
Os métodos também podem ter os atributos de visibilidade public,
private e protected com a mesma finalidade que é aplicado nos
atributos de classe. Além disso, existem outros atributos de visibilidade
que são específicos da linguagem C#.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


131
1.3 ACESSO POR PROPRIEDADES
Na linguagem C#, para definirmos dois tipos de visibilidade para um atributo, é possível utilizar
a propriedade (propriedade). No C# 3.0 e versões posteriores, as propriedades tornam a
declaração mais concisa quando nenhuma lógica adicional for necessária nos acessadores
de propriedade (MICROSOFT, 2019).

Ao declarar uma property, como apresentado no exemplo da Figura 3, o compilador cria


um campo de suporte privado e anônimo que pode ser acessado somente por meio dos
acessadores get e set da propriedade (MICROSOFT,2019).

Figura 3 - exemplo de propriedades

Fonte: Elaborada pelo Autor

O exemplo (Figura 3), representa a utilização de propriedades para os atributos de classe nome
e codigocliente. Perceba que no exemplo, o nome é definido como público (public) e como
consequência o get (pegar) e set (atribuir) serão visíveis para qualquer classe externa. Por outro
lado, codigocliente é definido como public, mas existe uma restrição para alterar codigocliente
(private set). Então, somente a própria classe Cliente poderá alterá-lo.

Perceba que este tipo de restrição pode ser importante, pois o código de cadastro do cliente
geralmente é gerado pelo banco. Então, por que deixar que ele seja alterado por uma classe
externa?

Figura 4 - exemplo de erro de acesso

Fonte: Elaborada pelo autor

No que exemplo da Figura 4, ao tentar atribuir um valor para o codigocliente na classe Program
é reportado um erro (sublinhado vermelho). A mensagem de erro informa que a propriedade
não pode ser usada no contexto porque está configurada para ser inacessível (private).

Percebeu a diferença entre atributo de classe e propriedade? No atributo de classe, existe

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


132
apenas um caminho para definir a visibilidade, ou seja, quando você definir um atributo de
classe como private, ele não poderá ser acessado tanto para leitura ou alteração. Por outro
lado, na propriedade você pode definir visibilidades distintas para leitura (get) ou atribuição
(set).

A partir deste momento, quando definirmos os atributos de classe no diagrama de classe, fique
à vontade para substituir por propriedade.

Na sintaxe do Diagrama de Classe (UML) não existe uma


VOCÊ SABIA? definição para propriedade.

Como seria o encapsulamento de atributos em outras linguagem? Na linguagem Java, para


realizar o procedimento idêntico ao de uma propriedade é necessário criar dois métodos, um
para get e outro para set, conforme exemplo a seguir.

public int getCodigocliente() {

return quantidade;

private void setCodigocliente(int codigocliente) {

this.codigocliente = codigocliente;

Perceba que o método set foi definido como private e isto é equivalente ao que realizamos no
código da Figura 3. Note ainda, que o método set precisa receber um parâmetro.

Voltando na classe Conta, para bloquear a alteração do saldo sem a utilização do método,
precisamos fazer as alterações apresentadas a seguir (Figura 5).

Figura 5 - exemplo da classe conta com propriedade

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


133
Fonte: Elaborada pelo Autor

Perceba que na linha 13 (Figura 5), o atributo da classe foi alterado para uma propriedade
e o set foi definido como private. Isto define que o valor não pode ser alterado por classe
externas. Porém, pode ser acessado/lido (get).

Para concretizar o aprendizado sobre Propriedades, vamos criar uma classe Calcular que
terá as seguintes propriedades: valorA, valorB e resultado. Vamos criar um método na classe
Calcular que seja resultado = valorA * Math.Sqrt(valorB), caso o valor de valorA seja maior do
que 50, caso contrário o cálculo deve ser resultado = valorA + Math.Sqrt(valorB). O valor do
resultado não pode ser alterado por classes externas.

Figura 6 - exemplo da classe Calcular

Fonte: Elaborada pelo Autor

A seguir (Figura 6), representa a criação da classe Calcular com a seguinte estrutura:

- Nas linhas 11 e 12 ,foram criadas as propriedades valorA e valorB. Perceba que elas são
públicas (public), tanto para alterar o valor (set) quanto para obter o valor (get).

- Na linha 13, é criado a propriedade resultado. Perceba que, foi definido que, não será possível
uma classe externa alterar o seu valor (private set).

- Entre as linhas 17 e 24, está a estrutura do método, conforme foi definido no exercício.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


134
O encapsulamento pode ser aplicado nos métodos de uma classe. O exemplo a seguir mostra
dois métodos, um public e outro private. O método Somar que possui a visibilidade pública,
pode ser acessado por classes externas, por outro lado, o método Multiplicar, que possui a
visibilidade private, não pode ser acessado por classe externas.

Mais adiante no texto, vamos discutir sobre a visibilidade protected, utilizada na herança.

Fantástico! Não é verdade? Agora você sabe como utilizar as propriedades, a seguir vamos
analisar outros tipos de visibilidade exclusivos da linguagem C#.

1.4 TODOS OS NÍVEIS DE ACESSIBILIDADE NA LINGUAGEM C#


Na linguagem C#, existem outros níveis de visibilidade além do public, protected e private
que serão descritos a seguir (Tabela 1).

Tabela 1 - Modificadores de acessibilidade

Acessibilidade declarada Significado

public O acesso não é restrito.

protected O acesso é limitado à classe que os contém ou aos tipos


derivados da classe que os contém.

internal O acesso é limitado ao assembly atual.

protected internal O acesso é limitado ao assembly atual ou aos tipos


derivados da classe que os contém.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


135
private O acesso é limitado ao tipo recipiente.

private protected O acesso é limitado à classe que o contém ou a tipos


derivados da classe que o contém no assembly atual.
Disponível desde o C# 7.2.

Fonte: (MICROSOFT, 2019)

Vale ressaltar que os modificadores de acesso não são permitidos em namespaces, pois,
namespaces não possuem nenhuma restrição de acesso. Além disso, dependendo do contexto
no qual ocorre uma declaração de membro, apenas algumas acessibilidades declaradas são
permitidas.

Você deve estar pensando: como posso utilizar todos os modificadores de acessibilidade?
Fique tranquilo, pois já abordamos os principais (private e public) e teremos mais exemplos
adiante na disciplina.

DICA DO AUTOR
Para conhecer mais detalhes sobre os modificadores na linguagem C#, clique
aqui.

Parabéns, agora você consegue criar propriedades em classe! Mas você sabe explicar a
diferença básica entre um atributo de classe e uma propriedade em relação a visibilidade?
No atributo de classe, quando definimos que ele é private, ele fica bloqueado tanto para
leitura ou para escrita. Já na propriedade, é possível definir caminhos distintos para leitura (get)
e escrita (set). Resumidamente, no atributo definimos apenas um caminho, tanto para leitura
quanto para a escrita. Por outro lado, na propriedade é possível definir tipos de visibilidade
distintas para leitura (get) e escrita (set).

1.5 MÉTODO CONSTRUTOR


Quando você utiliza a palavra chave new para criar um objeto, o runtime tem de construir esse
objeto utilizando a definição da classe. Neste momento, ocorre a instanciação do objeto, pois
o runtime cria um espaço no heap da memória para que o objeto seja alocado (SHARP,2010).

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


136
Um construtor é um método especial que executa automaticamente, quando você cria uma
instância de uma classe. Ele deve ter o mesmo nome da classe e pode receber parâmetros,
mas não pode retornar um valor, ou seja, ele sempre será do tipo void. Além disso, uma classe
pode ter vários métodos construtores, desde que tenha assinaturas distintas (tipos e quantidade
de parâmetros distintos).

Figura 7 - exemplo da classe método construtor

Fonte: Elaborada pelo Autor

O exemplo da Figura 7, representa uma classe com dois métodos construtores. Perceba que
os dois métodos não possuem tipo (int, void, float), porém, todo método construtor não retorna
nenhum valor. O primeiro método construtor (linha 12 a 15) é o padrão que será executado,
caso outro método não seja executado. O segundo método, é um construtor que, para ser
executado, precisa receber como parâmetro um valor do tipo inteiro.

! FIQUE ATENTO!

Atenção, pois ao criarmos vários métodos construtores na


mesma classe, estamos aplicando o conceito de sobrecarga
de métodos. Além disso, sobrecarga de métodos pode existir
em métodos NÃO construtores.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


137
Figura 8 - exemplo da classe método construtor

Fonte: Elaborada pelo Autor

No exemplo da Figura 8, é criada uma instância da ClasseA (Figura 7), em seguida, o segundo
método construtor ClasseA(int A) é utilizado. Perceba que ao instanciar, foi passado como
parâmetro o valor 20, o cálculo A + 20 foi executado e o resultado apresentado na tela. Note
que, se não fosse passado parâmetro, o primeiro método construtor seria executado.

No Visual Studio ao adicionar os primeiros parênteses “(“ de instanciação da classe são


apresentados quais os possíveis métodos construtores que podem ser utilizados e qual a assinatura
de cada método. Perceba que no exemplo a seguir, aparece a mensagem informando que
existem dois métodos construtores na ClasseA. E você pode utilizar as setas para navegar e
analisar todos os métodos construtores.

A assinatura do método é definida pela sua estrutura relacionada


VOCÊ SABIA? com os seguintes itens: nome do método, número de parâmetros
os modificadores dos parâmetros e os tipos dos parâmetros.

Para concretizar o aprendizado sobre método construtor, vamos criar um projeto que tenha
uma classe Circunferencia para realizar o cálculo da área. Nesta classe, vamos criar dois
métodos construtores, o primeiro será padrão, ou seja, sem parâmetros, o segundo terá como
parâmetro o valor do radiano.

Figura 9 - classe Circunferencia

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


138
Fonte: Elaborada pelo Autor

No exemplo da Figura 9, temos dois métodos construtores. Então, vamos analisar o código:

- Na linha 11, foi criado o atributo de classe para armazenar o valor do radiano, perceba que
não utilizamos propriedade e o atributo é do tipo private, ou seja, somente a própria classe terá
acesso ao valor.

- Entre as linhas 12 e 15, está a estrutura do primeiro método construtor.

- Entre as linhas 16 e 19, está a estrutura do segundo método construtor. Perceba que utilizamos
um novo conceito. Como o parâmetro do método possui o mesmo nome do atributo de classe,
foi utilizado o termo this, que define que a variável é um atributo de classe e não o parâmetro.

- Entre as linhas 20 e 23, é definida a estrutura do método CalcularArea. Note que este método
retorna um tipo double.

Figura 10 - Executando um objeto da classe Circuferencia

Fonte: Elaborada pelo Autor

O exemplo da Figura 10, cria uma instância da classe Circunferencia e executa um exemplo
de cálculo da área:

- Na linha 13, foi criado um tipo Cincunferencia. Note que neste momento, ainda não foi
criado uma instância.

- Na linha 14, é criada uma instância da classe Circunferencia. Neste momento, é


utilizado o segundo método construtor, passando como valor o número 50.

- A Linha 15, executa e imprime o valor do cálculo da área na tela. Perceba que foi
utilizado o nome do objeto mais o nome do método (c.Area()). Isto é possível, pois o
método CalcualarArea retorna um valor do tipo double.

Durante o desenvolvimento de programas orientado a objetos, você provavelmente terá que

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


139
utilizar métodos construtores. Então, parabéns! Pois, você agora sabe como utilizar métodos
construtores!

1.6 TRABALHANDO COM HERANÇA


Herança é um conceito importante no mundo da programação orientada a objetos. Você
pode usá-la para auxiliar no reaproveitamento do código ao definir classes diferentes com
várias características em comum e que estão claramente relacionadas entre si. Talvez sejam
classes diferentes, porém do mesmo tipo, e cada uma delas com sua característica própria e
distinta, por exemplo, médico, enfermeiro e todos os empregados de um hospital, pertencem
ao tipo funcionário, porém com algumas características distintas. Por exemplo, o médico possui
os atributos, Especialidade e CRM, mas o enfermeiro não possui (SHARP, 2010).

Se você estiver escrevendo um programa para simular cadastro de funcionário do hospital,


como especificaria que os médicos e enfermeiros possuem várias características em comum,
mas também são diferentes? .

No mercado se você perguntar para alguns desenvolvedores experientes sobre o que eles
entendem sobre herança, em geral, você terá respostas diferentes e contraditórias, o que
de fato é compreensível, pois a própria palavra herança tem vários significados sutilmente
diferentes. Por exemplo, se uma pessoa deixar uma herança para você, é correto dizer que
você herdou. Da mesma forma, você herda metade dos seus genes da sua mãe e a outra
metade do seu pai (SHARP, 2010).

Na programação herança é essencialmente classificada como um tipo de relação entre duas


classes. Por exemplo, a Figura 11 (diagrama de classe) representa a relação de herança entre
classes. A classe Forma é chamada de superclasse ou classe pai. As classes Circunferencia e
Quadrado são chamadas de subclasse ou classe filha. Veja que a seta identifica que as classes
herdam da classe Forma. Além disso, a classe Forma é abstrata, conceito que será abordado
mais adiante.

! FIQUE ATENTO!

Geralmente as subclasses são chamadas de classe especialistas


e as superclasses são chamadas de generalistas.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


140
Figura 11 - diagrama de classe com exemplo de herança

Fonte: Elaborada pelo Autor

Algumas características podem ser destacadas no diagrama (Figura 11):

- Os dois atributos area e perimetro podem ser alterados apenas pela própria classe ou
pelas duas classes filhas (Quadrado e Circunferencia).

- Perceba que existem dois métodos na classe Quadrado e Circunferencia que definem
que os métodos irão sobrepor o método da classe Forma.

- Note que a classe Quadrado possui o atributo lado que é exclusivo dela, pois para
realizar o cálculo da área e do perímetro, será necessário informar este valor. Por outro
lado, a classe Circunferencia possui o atributo radiano que precisa ser informado para
realizar os mesmos cálculos.

- Os atributos area e perimetro que são utilizados para armazenar os resultados dos cálculos,
são do tipo protected que no diagrama de classe é representada pelo símbolo #. Isto
define que eles podem ser alterados pela própria classe e pelas classe filhas (subclasses).

- O restante dos atributos e métodos são do tipo public (+), ou seja, podem ser acessados
e alterados por classes externas.

- Perceba que o nome da classe Forma está em itálico. Isto significa que a classe é do
tipo abstrata. Uma classe abstrata não pode ser instanciada. Então, se analisarmos com
cuidado, deixar a classe Forma como abstrata seria importante e coerente, pois sempre
que for necessário realizar um cálculo é necessário instanciar a classe especialista
(subclasse) e não a classe generalista (superclasse).

Agora vamos implementar as classes do diagrama (Figura 11).

Figura 12 - classe Forma

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


141
Fonte: Elaborada pelo Autor

O exemplo da Figura 12, representa a criação da classe Forma. Note que, existem as
seguintes características e conceitos:

- Na linha 9, o termo abstract define que a classe é abstrata. Uma classe abstrata não
pode ser instanciada por outras classes. Mais adiante, teremos um conteúdo exclusivo
para classe e métodos abstratos.

- Nas linhas 11 e 12, foram criadas propriedades como alternativa aos atributos de classe.
Note que, estes atributos são públicos para leitura (get) e protected para alteração (set),
ou seja, somente a classe e as classe filhas podem alterar o valor da area e perimetro.

- Nas linhas 14 e 15, foram criadas apenas as assinaturas dos métodos. Além disso, foi
adicionado um novo conceito, pois quando adicionamos o termo virtual antes do
void, deixamos claro que o método pode ser sobreposto pelas subclasses (Quadrado
e Circunferencia). Neste momento, você percebe que existe uma coerência, pois
cada tipo de forma geométrica possui um cálculo diferente para descobrir a área e o
perímetro. Então, quem será responsável por implementar os cálculos serão as classes
Quadrado e Circunferencia.

Figura 13 - classe Circunferencia

Fonte: Elaborada pelo Autor

O exemplo da Figura 13 representa a implementação da classe Circunferencia:

- Note que na linha 9, foi adicionado após o nome da classe o seguinte código : Forma.
isto declara que a classe Circunferencia é filha (subclasse) da classe Forma. Então, a
partir dessa declaração tudo que for public ou protected da classe Forma será herdado
pela classe Circunferencia.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


142
- Na linha 11, foi criada um propriedade para armazenar e controlar o valor do radiano.
Note que o get e set são públicos (public).

- Note que na linha 13, ao criar o método CalcularArea(), foi adicionado o termo override,
este termo define que o método vai sobrepor o método da superclasse Forma. Atenção:
Neste momento, estamos aplicando o conceito de polimorfismo que é um dos pilares da
programação orientada a objeto.

- Na linha 15, é implementado o cálculo da área. Você deve estar pensando: onde foi
criado o atributo de classe ou propriedade com nome area na classe Circunferencia?
Neste momento, notamos a aplicação da herança, pois a propriedade area está na
classe Forma e foi herdado pela classe Circunferencia. Mas porquê? Porque qualquer
forma geométrica possui uma área.

- Na linha 18, o método CalcularPerimetro() também é uma sobreposição (override) do


método da superclasse. Na linha 20, é calculado o perímetro da circunferência.

LEMBRE-SE!
Polimorfismo é a capacidade de que métodos de classe que
possuem um relacionamento de herança com outra classe possam
ter comportamento com características próprias.

Figura 14 - classe Quadrado

Fonte: Elaborada pelo Autor

O exemplo da Figura 14 representa a implementação da classe Quadrado:

- Na linha 9, é criada a classe Quadrado que como herança da classe Forma (: Forma).

- O restante da estrutura realiza o cálculo da área e perímetro.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


143
Note que as classes Quadrado e Circunferencia são idênticas. A diferença está na
propriedade lado que existe apenas na classe Quadrado e radiano que existe apenas na
classe Circunferencia. Além disso, existe a diferença dos cálculos dos métodos.

Agora vamos implementar uma estrutura na classe Program para realizar o cálculo da área e
perímetro da Circunferência.

Figura 15 - calculando a área e perímetro da circunferência

Fonte: Elaborada pelo Autor

O exemplo da Figura 15, possui as seguintes características:

- Na linha 13, é criada uma instância da circunferência.

- Nas linhas 14 e 15, é solicitado o valor do radiano.

- Nas Linhas 16 e 17, os métodos são invocados e os cálculos são realizados.

- Na Linha 18, os valores dos perímetro e área são apresentados na tela. Note que os
valores foram arredondados para duas casas decimais (N2).

VAMOS PRATICAR?!
Exercício Resolvido 01 - Utilizando o exemplo de cálculo de formas
geométricas, realize as alterações conforme descrito e o diagrama
de classe disponível a seguir:
• Adicionar a classe Triangulo que herda da classe Forma.
• Implementar o método CalcularArea() de acordo com o tipo
do triângulo.
• O método TipoTriangulo() deve retornar se o triângulo é
Isósceles, equilátero ou escaleno.
• A classe Program deve ter uma opção para o usuário escolher
qual a Forma ele deseja calcular (Dica: utilizar o if)

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


144
Figura 16 - Exercício 01

Fonte: Elaborada pelo autor

importante

De acordo com boas práticas, a classe Triangulo poderia ser


dividida em quatro classe: Triângulo, Isósceles, Equilátero e
Escaleno. Mas este é um assunto que será abordado em outro
momento.

Lembra da nossa classe conta? Se não lembra, volte no início da aula e analise sua estrutura.

Imagine um ambiente bancário onde as contas possam ter atributos e forma de realizar o
saque e depósito distintas. Por exemplo, em uma conta corrente, para analisar se existe o saldo,
seria necessário um atributo para controlar o valor do cheque especial. Ao analisar se existe
saldo para realizar um saque, seria necessário considerar o valor do cheque especial. Por outro
lado, em uma conta poupança não existe cheque especial. Neste momento, percebemos
que uma alternativa seria a utilização de herança. Então, vamos transformar a classe Conta
em três classes: Conta, Corrente e Poupança. Primeiro, vamos alterar a classe Conta, conforme
exemplo apresentado a seguir.

Figura 17 - Classe conta alterada

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


145
Fonte: Elaborada pelo Autor

O Figura 17, representa a alteração na classe conta, com as seguintes modificações:

- O set (Alteração) da propriedade saldo foi alterado para protected, pois apenas a própria
classe e as classes filhas (Poupanca e Corrente) podem alterar o valor do saldo.

- Na implementação do método sacar foi retirada e adicionado o termo virtual. Lembre-se


que o termo virtual indica que o método pode ser sobreposto nas subclasses (filhas).

- Como o método depositar é idêntico para todas as classes, sua estrutura foi implementada
na classe Conta.

Figura 18 - classe conta corrente

Fonte: Elaborada pelo Autor

O exemplo da Figura 18 representa a classe Corrente. Note que, a classe herda da classe
Conta (Corrente : Conta). Além disso, foi adicionado uma propriedade para controlar o cheque
especial. E no Método Sacar, para realizar o saque o valor precisa ser maior do que a soma do
saldo mais o cheque especial.

Figura 19 - Classe conta poupança

Fonte: Elaborada pelo Autor

O exemplo da Figura 19, representa a classe Poupanca. Note que a classe herda da classe

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


146
Conta (Poupanca : Conta). No Método Sacar, é analisado se existe saldo, diferente da conta
Corrente que considera o valor do cheque especial.

Para finalizar o aprendizado sobre herança, vamos analisar algumas vantagens. Ao analisar
as classes Conta, Poupanca e Corrente perceba que, foram criadas as classes especialistas
(Poupanca e Corrente). No futuro, se for necessário, adicionar uma classe para conta salário,
seria necessário criar uma nova classe sem alterar a estrutura atual. Então, imagine que o
programa já esteja em produção (instalado na empresa), se você adicionar uma nova classe,
sem precisar alterar o código da estrutura que já foi testada e está sendo utilizada pelo usuário,
você pode garantir, com certo grau de certeza que, as funcionalidades já testadas das classes
Poupanca, Conta e Corrente não serão alteradas. Então, é possível afirmar que a herança
pode auxiliar na manutenabilidade, testabilidade e reusabilidade.

importante

Herança é um dos conceitos mais importantes da programação


orientada a objetos. Entretanto, em breve, vamos aprender o
conceito de Interface que em alguns casos pode substituir a
herança.

CONECTANDO

Conhecer os detalhes da estrutura dos métodos é indispensável para desenvolvedores


de produtos de software. Além disso, a utilização de métodos será abordada em outras
disciplinas do curso.

1.7 MÉTODOS E CLASSES ABSTRATAS


Uma classe abstrata é uma classe que serve de modelo para outras classes. Ela sempre será uma
superclasse genérica, e suas subclasses serão mais específicas. Além disso, ela não pode ser
instanciada e pode conter ou não métodos abstratos, podendo ser implementados nas classes
descendentes. Ou seja, uma classe abstrata pode implementar ou não um método, sendo
obrigatória a existência de pelo menos um método abstrato, sem corpo. Pense: ao ouvirmos a

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


147
palavra animal, podemos imaginar um gato, um cachorro, etc. Ou seja, uma palavra genérica
pode nos levar a imaginar coisas mais específicas (WIKIVERSIDADE, 2019).

Lembre-se, que as classes abstratas geralmente possuem métodos abstratos que serão
implementados por classes filhas. Mas em C# pode existir uma classe abstrata sem que os
métodos sejam abstratos. E quando você definir que um método será abstrato a subclasse
deverá, obrigatoriamente, possuir este método. Ops! Já estava esquecendo. Uma classe
abstrata não pode ser instanciada.

Agora, vamos desenvolver um exemplo com a utilização de classes e métodos abstratos.


Lembra do nosso exemplo de Formas geométricas? Se analisarmos a classe Forma, ela não
pode ser instanciada, pois ela serve apenas como base para as formas geométricas (classes
concretas). Pense! Você calcula uma Forma geométrica sem saber como ela é? Impossível,
não é verdade!

Sobre os métodos, você concorda que, para toda forma geométrica, existe uma forma de
calcular o perímetro e área. Então, ao criar uma superclasse abstrata com métodos abstratos
você define uma regra. Pois, toda classe que herdar dessa classe deve obrigatoriamente
declarar os métodos abstratos. Mas lembre-se, declarar é diferente de implementar, e isto
significa que a subclasse pode apenas declarar a estrutura do método sem implementá-lo.

Figura 20 - Classe abstrata Forma

Fonte: Elaborada pelo Autor

O exemplo da Figura 20, representa a alteração da classe Forma para abstrata. Além disso,
alguns métodos foram transformados em abstratos:

- Na linha 9, ao adicionar o termo abstract informamos que a classe é abstrata.

- Nas linhas 14 e 15, note que, os métodos CalcularArea e CalcularPerimetro foram


definidos como abstract. Neste momento, é definido que qualquer classe que herdar
da Forma deve possuir esses métodos. Note que, no final, foi adicionado ponto e vírgula,
pois como o método é abstrato ele não pode ser implementado na classe abstrata.
Importante, os métodos somente podem ser abstratos se a classe for abstrata.

- Na linha 16, criamos um método CalcularCor que é virtual e pode ou não, ser utilizado
pelas subclasses;

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


148
Figura 21 - Simulação de erro na classe Quadrado

Fonte: Elaborada pelo Autor

O exemplo da Figura 21, representa a classe Quadrado que herda da classe Forma (abstrata).
Note que, não foi criado/sobreposto o método CalculcarPerimetro. Neste exemplo, a IDE
(Visual Studio) mostra que existe um erro, pois é obrigatório que todos os métodos abstratos
sejam declarados.

importante

Mais adiante na disciplina, vamos estudar sobre interface


que pode ser utilizada para realizar de forma mais segura, os
conceitos que acabamos de aprender sobre classe e métodos
abstratos.

1.8 CLASSE COMO ATRIBUTO


Lembra da nossa classe conta (Figura 17)! Neste exemplo, tínhamos o nome do cliente, não é
verdade? Mas cliente pode possuir nome, telefone, código identificador, endereço e outros
dados próprios. Concorda que seria interessante criar uma classe apenas para Cliente?

Então, para resolver este problema, basta criarmos uma classe Cliente, onde tudo que pertencer
ao cliente será adicionado nesta classe. O exemplo da Figura 22, representa a classe Cliente
com duas propriedades.

Figura 22 - Classe cliente

Fonte: Elaborada pelo Autor

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


149
Você deve estar pensando: um cliente pode ser pessoa Física ou Jurídica (empresa)? Sim, isto
é verdade! Seria possível detalhar ainda mais os dados do cliente ao utilizar os conceitos de
herança, ou seja, seriam criadas mais duas classes PessoaFisica e PessoJuridica que herdariam
da classe Cliente. Mas vamos deixar isto para outro momento da disciplina.

Como criamos uma classe Cliente, então será necessário alterar a classe Conta. Note que, no
exemplo da Figura 23, o atributo de classe nome foi substituído por uma instância da classe
Cliente.

Figura 23 - Classe conta com classe cliente

Fonte: Elaborada pelo Autor

Para acessar o nome do cliente, a partir deste momento, será necessário acessar o objeto
cliente que está agregado à classe conta. O exemplo a seguir, representa este acesso.

Perceba que, para acessar e armazenar o nome do cliente foi acessado o objeto contabancaria
que possui o objeto cliente. (contabancaria.cliente.nome). Além disso, se você quiser detalhar
ainda mais, seria possível criar uma classe Endereco que estaria agregada na classe Cliente,
que em seguida, estaria agregada na classe Conta.

2 - ORGANIZANDO MEU CÓDIGO


Para finalizar esta aula, vamos abordar um assunto interessante, como codificar e padronizar
os nomes dos objetos na codificação. Perceba que, durante os exemplos que abordamos até
o momento, não abordamos sobre como denominar os objetos. Ou seja, será que o nome de

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


150
uma variável pode ser maiúsculo? Será que o nome do método deve seguir um padrão? Para
nos auxiliar, existem algumas convenções que podem ser adotadas, entre elas, estão o Pascal
Case e Camel Case que serão abordados a seguir.

Mas antes de abordar sobre convenções, vamos analisar um pouco da história. Nas décadas
de 1970 e 1980, começou a ser adotada uma prática de escrita utilizando uma convenção de
nomeação padrão ou alternativa para identificadores em várias linguagens de programação.
A origem desta convenção na programação de computadores não é precisa. Entretanto, a
utilização desta técnica é recomendada pelas diretrizes de estilo de codificação de muitas
organizações ou projeto de software (KITAMURA,2019)

2.1 PASCAL CASE


No pascal case, a primeira letra de toda palavra dos objetos deve ser maiúscula. Geralmente,
utilizado para nome dos namespaces, classe, propriedades e métodos.

2.2 CAMEL CASE


No pascal case, a primeira palavra deve ser minúscula e, a partir da segunda palavra, a Primeira
Letra deve ser maiúscula. Geralmente, utilizado para nome dos parâmetros de métodos,
variáveis dentro dos métodos.

2.3 CONVENÇÕES DO .NET


No caso do .NET, a Microsoft possui algumas recomendações. Lembre-se, como não são
obrigatórias (por isso são chamadas de convenções), mas sua utilização facilita a compreensão
do código fonte por outro programador. As convenções de codificação atendem às seguintes
finalidades:

- Criam uma aparência consistente para o código, para que os leitores possam se
concentrar no conteúdo e não no layout.

- Permitem que os leitores entendam o código com mais rapidez, fazendo suposições
com base na experiência anterior.

- Facilitam a cópia, a alteração e a manutenção do código.

- Demonstram as práticas recomendadas do C#.

Como são várias as convenções utilizadas pela Microsoft, sugiro que acesse o material oficial.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


151
importante

A partir da próxima aula, vamos utilizar o Pascal Case e o Camel


Case para definir o nome dos objetos. E vamos utilizar algumas
convenções da Microsoft. Então, leia a documentação da
Microsoft sobre convenções da linguagem C# na íntegra.
Para realizar a leitura da documentação, clique aqui.

VAMOS PRATICAR?!
Exercícios Resolvido 02 - Um software possui 3 classes: ClasseA,
ClasseB, ClasseC. Utilizando a linguagem orientada a objetos C#
com projeto Console, desenvolva as características descritas a
seguir:
2A– A classeA possui uma propriedade com nome Resultado,
que pode ser alterado apenas pelas classes filhas, mas pode
ser visualizado por outras classes. Nesta mesma classe, existe um
método com nome Calcular():void que será implementado nas
classes filhas. Além disso, essa classe será abstrata.
2B– A classeB herda da ClasseA. Entretanto ela possui três atributos
ou propriedades de classe X, Y e Z. Nesta mesma classe o método
Calcular():void da ClasseA deve ser sobreposto com a seguinte
equação: Resultado = X + Y * 2. Entretanto se o valor de Z for maior
do que 50, o cálculo será Resultado = X + Z * 2.
2C – A classeC herda da classeA, onde o método Calculo():void
da ClasseA deve ser sobreposto com a equação: Resultado = A/B
+ Math.Sqt(Y). Crie os atributos de classe A e B. Cuidado, caso o
valor de B seja igual a zero o resultado deve ser igual a 0.
2D – Na classeC deve ter os atributos nome, telefone.
2E – Crie uma Estrutura na classe Program para realizar o cálculo
da classe A ou B.
2F – Resumidamente, explique(comente no código) onde e quais
conceitos de POO foram utilizados nas classes criadas.
FOLHA DE RESPOSTAS: Os exercícios resolvidos estão disponíveis
na pasta da aula 04

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


152
aUTOaVALIAÇÃO
Após o término dessa Aula, você é capaz de desenvolver e aplicar os conceitos
de herança? É capaz de desenvolver e aplicar os conceitos de métodos
construtores? Consegue aplicar os conceitos de encapsulamento? Caso
você consiga responder estas questões, parabéns! Você atingiu os objetivos
específicos desta Aula! Caso tenha dificuldades para responder alguma(s)
dela(s), aproveite para reler o conteúdo da Aula, acessar o UNIARAXÁ Virtual
e interagir com seus colegas e com o(a) tutor(a) e esclarecer todas as suas
dúvidas. Você não está sozinho nessa caminhada! Conte conosco!

RECAPITULANDO
Caro(a) Aluno(a), chegamos ao fim da nossa Aula. Espero que tenha compreendido o
conteúdo e resolvido os exercícios. Inicialmente, estudamos os conceitos de encapsulamento
e sua implementação no código, em especial, utilizamos as propriedades da linguagem C#.
Abordamos os conceitos de herança e implementamos alguns exemplos. Por fim, foram criados
exemplos de método construtor, polimorfismo e outros conceitos que fazem parte a linguagem
de programação orientada a objetos.

Muito bem! Em nossa próxima Aula, vamos continuar nosso estudo sobre Programação
Orientada a Objetos, com ênfase no desenvolvimento de programas com várias classes,
utilização de herança, propriedades, encapsulamento e outras estruturas.

E, aí, preparado(a) para mais uma jornada de conhecimento?

VIDEOAULA
Após a leitura e o estudo do seu livro-texto, chegou o momento de
complementar seu conhecimento. Vá até seu Ambiente Virtual
de Aprendizagem e acesse a Videoaula referente à Aula.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


153
REFERÊNCIAS
ASCENCIO, Ana Fernanda Gomes; DE CAMPOS, Edilene Aparecida Veneruchi. Fundamentos
da programação de computadores. Pearson Educación, 2008.

CAELUM. C# e Orientação a Objetos. São Paulo. Caelum. 2017.

DEITEL, H.; DEITEL, P.; STEINBUHLER, K. C# Como Programar. 1. ed. São Paulo: Pearson, 2003.

KITAMURA, CELSO. Pascal Case e Camel Case O que é e como usar. Disponível em: https://
celsokitamura.com.br. Acesso em: 01 de Mai. 2019.

MANZANO, José Augusto N. G. Programação de computadores C#. São Paulo: Érica, 2014.

MICROSOFT. Disponível em https://docs.microsoft.com/pt-br. Acesso em: 14 de Abr. de 2019.

SHARP, John; MANIEZ, Dominique. Visual C# 2010. Microsoft Press, 2010. Porto Alegre:
Bookman, 2011.

WIKIVERSIDADE, Conceitos de Orientação a Objetos/Classe Abstrata.

Disponível em: https://pt.wikiversity.org/wiki. Acesso em: 01 de Mai. de 2019.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


154
SUMÁRIO

AULA 5
Objetivos Específicos:

• Desenvolver métodos com tipo de passagem por referência.


• Implementar classes e métodos estáticos.
• Implementar Lista genéricas.
• Implementar enumeradores e estruturas
• Compreender e desenvolver estruturas utilizando interfaces.
• Compreender sobre convenções e organização de código.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


155
UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS
2
AULA 5 - DESENVOLVENDO SOFTWARE ORIENTADO
A OBJETOS - PARTE III
CONTEXTUALIZANDO A APRENDIZAGEM
Prezado(a) Aluno(a), na Aula anterior você estudou sobre herança, métodos e classes abstratas,
encapsulamentos e outros conceitos e estruturas que são características das linguagens
Orientada a Objetos.

Nessa aula, vamos estudar outras estruturas da linguagem C# e aplicar os conceitos de


programação orientada a objetos por meio do desenvolvimento de programas. Ao final dessa
Aula, você será capaz de trabalhar com listas e outros conceitos avançados de Programação
Orientada a Objetos. Você sabe trabalhar com lista genérica? Sabe o conceito e aplicação de
classes abstratas? Consegue organizar o código utilizando enumeradores e estruturas? Nessa
aula você terá as respostas para essas outras perguntas.

! FIQUE ATENTO!

Fique atento(a), pois a resolução dos exercícios resolvidos estão


disponíveis no AVA (Ambiente Virtual de Aprendizagem). Neste
momento é indispensável o desenvolvimento dos exercícios
utilizando uma IDE.

Boa aula!

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


156
MAPA MENTAL PANORÂMICO
Para contextualizar e ajudá-lo(a) a obter uma visão panorâmica dos conteúdos que você
estudará na Aula 5, bem como entender a inter-relação entre eles, é importante que se atente
para o Mapa Mental, apresentado a seguir:

DESENVOLVENDO SOFTWARE
ORIENTADO A OBJETOS - PARTE III

TRABALHANDO COM REF


E OUT

REVISANDO E PASSAGEM DE ARRAY


IMPLEMENTANDO OUTRAS COMO PARÂMETRO
ESTRUTURAS DE MÉTODOS

OBJETO DE CLASSE
COMO PARÂMETRO
MÉTODO E CLASSE
ESTÁTICA

ENUMERADORES E
ESTRUTURAS

EXEMPLOS PRÁTICOS DE
UTILIZAÇÃO DE LISTAS
LISTA GENÉRICA
CRIANDO LISTA DE
OBJETOS DE CLASSES

INTERFACE

PASCAL CASE

ORGANIZANDO MEU
CAMEL CASE
CÓDIGO

CONVENÇÕES DO .NET

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


157
1 - REVISANDO E IMPLEMENTANDO OUTRAS ESTRUTURAS DE MÉTODOS
Para complementar o aprendizado sobre métodos que foi amplamente discutido nas aulas
anteriores, nesta aula iremos abordar outros tipos de estruturas e assinaturas de métodos. Você
deve estar pensando: mas já estudamos sobre métodos? Sim, mas nas aulas anteriores, para
auxiliar no seu aprendizado, abordamos apenas as estruturas básicas dos métodos.

1.1 - TRABALHANDO COM REF E OUT


Na aula anterior, você aprendeu como utilizar métodos, com ou sem retorno e com ou sem
parâmetros, então neste momento vamos abordar outros detalhes sobre métodos relacionados
a utilização de parâmetros utilizando os termos ref e out.

LEMBRE-SE!
Mas você lembra o conceito de método? Vamos relembrar: método
pode ser definido como um trecho de código independente de
qualquer parte da classe, porém relacionado as funcionalidades
propostas dentro do programa. Ou seja, os métodos são um conjunto
de instruções que efetuam uma tarefa específica. De forma geral, os
métodos podem (ou não) receber valores de entrada que podem ser
opcionais e que são chamados de parâmetros dos métodos. Além
disso, em algumas situações, um método pode gerar um valor de
saída (retorno) (SHARP, 2010).

Então vamos lá! Geralmente, quando você passa um argumento para um método, o parâmetro
correspondente é inicializado com uma cópia do valor. Isso é verdade independente do
parâmetro ser um tipo-valor (como int), um tipo nullable (como int?) ou um tipo-referência.
Então, esta estrutura indica que é impossível que qualquer alteração no parâmetro afete o
valor do argumento passado (SHARP, 2010). Por exemplo, a Figura 1 possui uma um método
que recebe um valor e realiza o incremento do parâmetro (Linhas 19 e 21).

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


158
Figura 1: Exemplo de passagem de valor.

Fonte: Elaborada pelo Autor.

! FIQUE ATENTO!

Tipos nullable expõem algumas propriedades que você pode


utilizar. Como o HasValue que indica se um tipo nullable contém
um valor ou é null. Por exemplo, o código a seguir, adiciona o
valor null na variável a, então a condição o if é verdadeira,
como consequência, a recebe o valor 10.

Perceba que no exemplo da Figura 1, ao incrementar o valor que foi recebido no método
(parametroA++), o valor da variável valorA não foi alterado, pois ao passar o valor para o
parâmetro é realizado uma cópia dos dados. Contudo, talvez em algumas situações seja
necessário que, ao modificar o parâmetro, a variável original seja alterada. Para realizar este
procedimento é possível utilizar os parâmetros com o termo ref. Ou seja, se você utilizar ref,
o parâmetro torna-se um alias do argumento real, ao invés de uma cópia do argumento.
Resumidamente, o parâmetro terá o endereço da memória onde está armazenado o valor
da variável valorA. Ao alterar o parâmetro, o conteúdo do valor original, será alterado. Vale
ressaltar que, na computação a passagem de valor utilizando o ref é chamado de passagem
por referência.

DICA DO AUTOR
Se não lembra como funciona a passagem por referência, consulte a Aula 02.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


159
Figura 2: Exemplo de passagem de por referência.

Fonte: Elaborada pelo autor.

No exemplo da Figura 2, foi adicionado o termo ref antes de passar o valor como parâmetro (Linha
14) e no parâmetro do método (Linha 19). Ao incrementar o valor do parâmetro parametroA o
valor da variável valorA é alterado, pois ao imprimir a variável valorA é apresentado o valor 51,
diferente do exemplo da Figura 1, que foi criado sem o ref.

saiba mais!
Para saber mais detalhes sobre passagem de valor por referência assista um vídeo,
clicando aqui.

Outra forma de passagem de parâmetro seria a utilização do out que é semelhante a palavra
ref. Porém, quando utilizamos o out, informados que o parâmetro é do tipo output (saída), ou
seja, o valor final do parâmetro será retornado.

Figura 3: Exemplo de out.

Fonte: Elaborada pelo autor.

A Figura 3, representa um exemplo do out. Perceba que utilizamos o termo out ao passar o
valor para o parâmetro (Linha 14) e na declaração do parâmetro (Linha 19). Ao passar um
argumento com identificador out, o método deve obrigatoriamente atribuir um valor para o
parâmetro. Por exemplo, se retiramos a Linha 21, teremos um erro no código.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


160
1.2 - PASSAGEM DE ARRAY COMO PARÂMETRO
Os arrays de parâmetros são úteis se você quer escrever métodos que possam receber qualquer
número de argumentos. Mas você deve estar pensando: mas não posso utilizar métodos
sobrecarregados que tenham o mesmo nome, mas com assinatura diferente? Sim, afinal este é
um conceito muito utilizado na Programação Orientada a Objetos.

Então, antes de falar sobre array como parâmetro, vamos discutir e relembrar sobre sobrecargas
de métodos.

DICA DO AUTOR
Se você não lembra o que é uma array dimensional (vetor) e multidimensional
(matriz), leia a Aula 03.

O exemplo a seguir representa a estrutura de sobrecarga, que são métodos que possuem o
mesmo nome, porém com quantidade de parâmetros ou tipos de dados diferentes.

Perceba que, no exemplo anterior, os métodos possuem o mesmo nome, mas com assinaturas
diferentes. Então, ao utilizar o exemplo a seguir, o primeiro método será executado, pois o valor
que foi passado como argumento e do tipo int.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


161
LEMBRE-SE!
A assinatura do método é definida pela sua estrutura relacionada
com os seguintes itens: nome do método, número de parâmetros,
modificadores dos parâmetros e os tipos dos parâmetros.

Embora seja útil, a sobrecarga não cobre todos os casos. Particularmente, a sobrecarga não
trata uma situação em que o tipo dos parâmetros não varia, mas o número de parâmetros
sim. Se você quisesse realizar a soma de vinte valores, você teria que criar uma quantidade
expressiva de métodos, não é verdade?

Felizmente com a utilização de array, listas ou com tipo params, como parâmetro, é possível
escrever um método para receber um número de argumentos variável.

Figura 4: Exemplo de array com parâmetro.

Fonte: Elaborada pelo autor.

O exemplo da Figura 4, representa um exemplo de passagem de array como parâmetros:

• Nas Linhas 13 e 14, foram criados dois vetores com 5 e 3 elementos. Note que foram
atribuídos valores para todas as posições dos dois vetores.

• Na Linha 19, foi criado um método que recebe como parâmetro um array. O que define
a utilização do array como parâmetro é utilização dos colchetes [ ].

• Entre as Linhas 21 e 27, é realizado a soma e o valor é apresentado na tela.

• O método foi invocado duas vezes, nas linhas 15 e 16. Neste momento você pode
analisar a vantagem de utilizar esta estrutura. Note que o método foi capaz de somar
arrays com tamanhos diferentes.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


162
importante

Ao utilizar o array como parâmetro não é realizado uma cópia


do vetor. Neste momento a estrutura é idêntica a passagem
por referência (ref), conforme já discutimos nesta aula.

1.3 - OBJETO DE CLASSE COMO PARÂMETRO


Imagine que você precise criar uma classe que terá a responsabilidade de imprimir os dados
do cliente na tela. Então, neste momento, você teria que implementar duas classes conforme
o exemplo que é apresentado a seguir.

Inicialmente você criaria a classe para receber os dados do cliente.

No exemplo a seguir, seria criada uma classe com nome Imprimir que possui um método que
recebe como parâmetros o código e o nome. Em seguida, os dados são apresentados na tela.

No exemplo a seguir é criado instância das classes Cliente e Imprimir. Em seguida é passado
como parâmetros o código e o nome do cliente que estão armazenados no objeto da classe
cliente.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


163
Essa estrutura funciona perfeitamente, porém, imagine se o cliente possuísse vinte atributos de
classe a serem impressos na tela? Então, seria necessário passar vinte atributos para o método.
Seria inviável esta implementação, não é verdade?

Felizmente, para solucionar este problema, é possível passar como parâmetro o objeto da
classe. A seguir, temos a modificação do método da classe Imprimir. Note que para o método
funcionar ele precisa receber como parâmetro um objeto do tipo Cliente. No corpo do método,
o parâmetro que é um objeto do tipo Cliente é utilizado para imprimir os valores na tela.

Em seguida, é necessário alterar a estrutura responsável por invocar o método, conforme o


exemplo a seguir. Note que foi passado como parâmetro o objeto c que é do tipo Cliente.

Esta estrutura representa o objeto da classe Cliente como parâmetro do método. O interessante
é que a passagem de objeto de classe como argumento, utiliza a passagem por referência
(ref), ou seja, não é realizado uma cópia dos dados do objeto.

VAMOS PRATICAR?!
Exercício Resolvido 1:
Crie uma classe com nome Calcular que contenha os seguintes
métodos e estruturas:
• Criar um método para receber como parâmetro o um array e
calcular a média aritmética dos valores.
• O usuário poderá digitar o tamanho do array que deseja
calcular e digitar os seus valores. Em seguida os valores serão
calculados pelo método da classe Calcular.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


164
2 - MÉTODO E CLASSE ESTÁTICA
Já que estamos falando sobre métodos, vamos aprender sobre métodos estáticos que podem
ser utilizados em programas orientados a objetos.

Em vários exemplos utilizamos alguns métodos estáticos, por exemplo, na Figura 3, utilizamos o
método estático Main e Somar. Mas o que significa um método estático? Métodos estáticos
não requerem uma instância da classe e não podem acessar de forma implícita os dados. Na
linguagem C# o método estático é definido com o termo static no início da declaração. Além
disso, na Programação Orientada a Objetos, um método estático é considerado um método
da classe e não do objeto. Mas o que significa isto? Isto indica que não é preciso criar um
objeto (instância da classe) para utilizar o método. Vamos analisar um exemplo logo a seguir.

Até o momento, você aprendeu que, para utilizar um método de uma classe seria necessário
criar uma instância (objeto) da classe. Mas com a utilização de métodos estáticos isto não é
necessário. Vamos analisar a diferença entre os dois tipos de métodos: estáticos e não estáticos.

A seguir, a classe Calcular recebe dois parâmetros do tipo inteiro.

Note a seguir que, para acessar o método calcular, foi necessário criar uma instância da classe
Calcular para utilizar o método e escrever o resultado na tela.

Com a utilização de método estático não é necessário realizar o procedimento de instanciar um


objeto do tipo Calcular, conforme apresentado no exemplo anterior. Então, vamos aprender
como criar a mesma estrutura utilizando método estático.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


165
A classe Calcular do exemplo a seguir foi alterada. Note que foi adicionado o termo static na
declaração do método. Além disso, declaramos que a classe também é estática. Isto indica
que a classe não pode ser instanciada e que pode possuir apenas atributos e métodos estáticos.

A seguir temos o exemplo da utilização da classe e método estático que foram criados no
exemplo anterior. Note que foi adicionado o nome da classe com a invocação do seu método,
sem a necessidade de criar uma instância da classe.

Interessante não é verdade? Mas qual a utilidade de classes e métodos estáticos? Imagine
em um programa que você utiliza vários cálculos, por exemplo, cálculos de juros e regras de
negócio. Neste momento você pode criar uma classe estática com todos os cálculos e utilizar
em qualquer parte do programa, sem a necessidade de criar instâncias das classes. Muito mais
prático, concorda?

A seguir, vamos analisar outros exemplos para concretizar o seu aprendizado sobre métodos
estáticos.

Figura 5: Classe de Cálculo.

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


166
Note que no exemplo da Figura 5, foi criada uma classe com método responsável em calcular
o juro composto. Neste método foi utilizado o termo static no início da declaração. Isto define
que o método é estático e que, para ser utilizado, não precisa ser criado um objeto da classe
Calculo. A seguir, vamos analisar como seria a estrutura para utilizar um método estático.

Figura 6: Utilizando o método estático.

Fonte: Elaborada pelo autor.

Note que no exemplo da Figura 6, foi criada uma estrutura para receber os valores do capital,
juro mensal e quantidade de parcelas. Na Linha 25, para utilizar o método JuroComposto da
classe Calculo, não foi necessário criar uma instância da classe, pois o método é estático.
Ainda neste exemplo, foi utilizado outro método estático, pois utilizar o Math.Pow, não foi
necessário instanciar um objeto da classe Math, pois a classe e os métodos pertencentes a ela
são estáticos.

! FIQUE ATENTO!

Seria possível alterar a classe Calculo e defini-la como estática.


Além disso, lembre-se que, um método estático não pode
invocar outro método que não seja estático.

VAMOS PRATICAR?!
Exercício resolvido 2:
Utilizando mesmo exemplo apresentado sobre método e classe
estática. Crie um segundo método para calcular os juros simples.
Altere a classe programa solicitando que tipo de cálculo deseja
realizar. Lembre-se que o método deve ser estático e altere a
classe para que seja estática.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


167
3 - ENUMERADORES E ESTRUTURAS
Suponha que você queira representar os dias da semana em um programa. Você poderia
utilizar os valores inteiros de 1 a 7 para descrever de domingo a sábado. Este sistema funciona,
mas não seria muito intuitivo, pois seria necessário realizar a conversão, por exemplo, caso o
valor seja 1 seria domingo e assim por diante. Para facilitar esta abordagem, a linguagem C#
e outras linguagens, fornecem uma enumeração (às vezes chamada de enum) (SHARP, 2010).
Para declarar uma enumeração é necessário atribuir o termo enum, seguido por um conjunto
de símbolos que indicam valores válidos que o tipo pode ter.

Figura 7: Exemplo de enum.

Fonte: Elaborada pelo autor.

Temos um exemplo de enum na Figura 7 com a seguinte estrutura:

• Perceba que antes do nome da classe (Linha 9) foi criado um enum com nome
diaSemana e entre os colchetes foram definidos os valores que este enum pode assumir.

• Na Linha 12, o parâmetro do método precisa receber um tipo enum diaSemana.

• Na Linha 14, é realizada uma análise se o valor passado como parâmetro é Domingo.

Figura 8: Exemplo de utilização do enum.

Fonte: Elaborada pelo autor.

O exemplo da Figura 8 mostra a utilização do enum do objeto dia que é do tipo da classe
AnalisarDia. Perceba que na Linha 14, foi passado como parâmetro o termo domingo. Outra
vantagem de utilizar o enum está na definição de um intervalo válido que pode ser passado

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


168
como parâmetro.

Outro exemplo de enumeradores, é a associação de um valor inteiro a cada elemento da


enumeração. Por padrão, a numeração inicia em 0 para o primeiro elemento e sobe em
incrementos de 1. É possível recuperar este valor int e subjacente de uma variável de tipo
enumerado. Para isso, você deve fazer um casting para seu tipo subjacente. Perceba que
no exemplo a seguir, foi atribuído valores inteiros para cada dia da semana. E ao executar o
método ImprimirDia, caso seja passado o valor domingo como argumento, será impresso o
número 1 ao realizar o casting.

! FIQUE ATENTO!

A utilização de enumeradores facilita a programação e pode


evitar erros, visto que os dados passados são fixos e seus valores
são conhecidos.

VAMOS PRATICAR?!
Exercício Resolvido 3:
Criar um programa que tenha uma classe com nome Ano. Crie
um enumerador que tenha os meses do ano. Em seguida, crie
um método que receberá como parâmetro um enumerador dos
meses do ano. Esse método deve imprimir na tela qual trimestre
que o mês pertence.

4 - LISTA GENÉRICA
Trabalhar com coleções de dados é uma necessidade comum no desenvolvimento de
programas orientado a objetos. Até o momento você aprendeu a trabalhar com coleções
utilizando array. Entretanto, a utilização do array possui algumas desvantagens, como
ausência de alguns métodos para auxiliar na manipulação dos elementos e principalmente a
necessidade de determinar a quantidade dos elementos antes de começar a utilizá-los.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


169
Felizmente, como alternativa, a estrutura da linguagem C# e outras linguagens Orientada a
Objetos, fornecem várias classes que podem ser utilizadas para controlar coleções, cada uma
com características específicas que às tornam interessantes em determinadas situações. Entre
essas classes está a classe List que faz parte do namespace System.Collections.Generic. Esta
estrutura é chamada de lista genérica que é representada por List<T>, onde T é o tipo de item
que a coleção deverá conter.

A seguir vamos analisar como declaramos uma lista. Perceba que foram criadas três listas e
foram definidos os tipos de dados de cada uma. No primeiro exemplo, é criada uma lista de
objetos do tipo string. Na segunda, declaração criamos uma lista de objetos do tipo double e
foi delimitado a quantidade de elementos que podem ser armazenados na lista, representado
pelo número 32. Na última declaração foi criada uma lista de int e adicionado três valores.

A seguir, no Quadro 1, vamos conhecer as principais propriedades e métodos pertencentes a


Lista Genérica.

Quadro 1 - Propriedades da Lista Genérica

Principais Propriedades da Lista Genérica


Capacity: representa o número de elementos que a lista pode suportar sem que precise
ser redimensionada. A partir desse número, novos elementos farão com que o compilador
aloque mais memória para a lista.
Count: retorna (apenas leitura) a quantidade de itens que atualmente existe na lista.
Principais métodos:
Add(T item): adiciona o parâmetro de tipo T (definido na declaração) no final da lista.
AddRange(IEnumerable<T> collection): adiciona todos os itens da coleção que foi passada
como parâmetro à lista.
Clear(): como o nome sugere, esse método limpa a lista, removendo todos os elementos.
Contains(T item): retorna um valor booleano indicando se o item pesquisado existe na lista.
Exists(Predicate<T> match): retorna um booleano indicando se existe na lista um item que
atenda às condições definidas no predicado.
Find(Predicate<T> match): verifica se existe um ou mais itens que atendam à condição
definida em match e caso exista, retorna a primeira ocorrência.
FindAll(Predicate<T> match): funciona semelhante ao Find, mas retorna uma lista com todos
os itens que atendam à condição.
ForEach(Action<T> action): executa a ação definida para todos os elementos da lista.
Insert(int index, T item): funciona semelhante ao Add, mas insere o item em uma posição

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


170
definida por index.
InsertRange(int index, IEnumerable<T> collection): funciona semelhante ao AddRange, mas
insere a nova lista na posição definida por index.
Remove(T item): remove o item da lista e retorna um booleano indicando o sucesso da
operação. Caso o item não seja encontrado, também retorna false.
Sort(): ordena a lista utilizando o comparador padrão do tipo de item contido na lista. Este
método também pode receber como parâmetro objetos que definem a forma como a
comparação entre os itens deve ser feita.
ToArray(): retorna um vetor do tipo contido na lista.

Fonte: MICROSOFT (2019); LINHA DE CODIGO (2019).

4.1 - EXEMPLOS PRÁTICOS DE UTILIZAÇÃO DE LISTAS


Agora que você já aprendeu como declarar uma lista, vamos criar um exemplo para gerenciar
uma lista de elementos. No exemplo a seguir, perceba que é possível acessar um valor na lista
utilizando a mesma estrutura ao trabalhar com um array. Perceba que, para adicionar o valor
na lista utilizamos o Add e para mostrar o nome Maria, utilizamos o índice, que possui a estrutura
idêntica ao manipular um array dimensional (vetor).

Para você aprender como percorrer uma lista, tanto para adicionar ou para imprimir, a seguir
vamos analisar um exemplo.

Figura 9: Exemplo de lista genérica.

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


171
O exemplo da Figura 9, cria uma lista de valores do tipo inteiro e imprime esses valores na tela.
Então, vamos analisar a estrutura:

• Na Linha 13, é criada uma lista de valores do tipo int com nome valores.

• Entre as Linhas 14 e 17, está a estrutura repetitiva utilizando o for. Nessa estrutura é
adicionada os valores na lista. Perceba que na Linha 16, a cada repetição o valor de i
é adicionado na lista.

• Entre as Linhas 19 e 22, é realizada a impressão dos valores da lista na tela. Neste momento
é utilizado o comando de repetição foreach, que não abordamos até o momento. A
estrutura de repetição do foreach percorre uma coleção de dados automaticamente.
A cada repetição a “variável” item terá o valor de um item da lista, por exemplo, na
primeira execução (Linha 21), o item terá o valor 1, na segunda o valor 2, e assim por
diante, até percorrer toda lista. Além disso, no lugar do termo var, seria possível adicionar
int, pois os valores da lista do exemplo pertencem a este tipo

Para exemplificar a utilização de alguns métodos da lista, a seguir vamos analisar como
adicionar e remover itens da lista.

Figura 10: Removendo elementos da lista.

Fonte: Elaborada pelo autor.

Perceba que, no exemplo da Figura 10, na Linha 18 foi utilizado o método Remove, e passado
como parâmetro valor 1. Então, o primeiro valor da lista foi removido. Na linha 19, foi utilizado o
método RemoveAll para remover todos os elementos da lista maiores do que 5, neste exemplo
utilizamos lambda.

Você deve estar pensando: o que é lambda? Fique tranquilo, pois este conteúdo será abordado
mais adiante na disciplina.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


172
4.2 CRIANDO LISTA DE OBJETOS DE CLASSES
É comum a necessidade de criar lista de objetos de classe. Por exemplo, imagine em um
sistema de vendas seria possível utilizar uma lista de objetos do tipo produtos armazenados
em um objeto com nome itens, para armazenar os produtos que fazem parte do carrinho de
compras do cliente.

Vamos analisar outro exemplo! O exemplo do diagrama de classe a seguir (Figura 11),
representa o relacionamento de composição entre as classes Cliente e Telefone. Neste exemplo
foi definido que um cliente é composto por telefones e não pode existir sem que exista pelo
menos um telefone.

Figura 11: Exemplo de Composição.

Fonte: Elaborada pelo autor.

A seguir vamos implementar o código da Figura 11. Preste atenção nos detalhes!

O código da Figura 12, representa a classe Telefone. Note que a classe não possui métodos.

Figura 12: Classe Telefone.

Fonte: Elaborada pelo autor.

O código a seguir (Figura 13), representa a classe Cliente. Note que ela possui propriedades,
atributos de classe e métodos.

Figura 13: Classe Cliente.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


173
Fonte: Elaborada pelo autor.

A estrutura do código da classe Cliente (Figura 13), pode ser detalhada como:

• A Linha 13, contém a declaração de um atributo de classe que representa uma lista do
tipo da classe Telefone. Esta declaração representa a composição que foi definida no
diagrama de classe (Figura 11).

• O método AdicionarTelefone recebe como parâmetro um objeto do tipo Telefone e no


corpo da sua implementação este objeto é adicionado na lista.

• O método RemoverLista também recebe como parâmetro um objeto do tipo Telefone,


porém, remove o item da lista.

• O método ImprimirTelefones não recebe nenhum parâmetro e percorre toda lista,


imprimindo o ddd e número dos telefones armazenados na lista.

O código a seguir representa o cadastro e impressão dos telefones na lista.

Figura 14: Manipulação das listas.

Fonte: Elaborada pelo autor.

A estrutura do código da classe Program (Figura 14), pode ser detalhada como:

• Nas Linhas 13 e 14, são criados os objetos da classe Cliente e Telefone.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


174
• Nas Linhas 18 a 21, os dados do ddd e número do telefone são armazenados no tel que
é um objeto da classe Telefone.

• Na Linha 22, o objeto tel é adicionado na lista através do método AdicionarTelefone da


classe Cliente.

• Perceba que são adicionados dois telefones, conforme a quantidade de iterações que
foram definidas no for.

• Na Linha 24, o método ImprimirTelefones é invocado e imprime todos os telefones da


lista.

VAMOS PRATICAR?!
Exercício Resolvido 4:
Crie um controle para armazenar os dados de Funcionários e
Dependentes. Utilize a lista para armazenar os dependentes
dentro da classe Funcionário, além disso, mostre na tela todos os
dependentes do funcionário.

5 - INTERFACE
É possível definir como interface o contrato entre as classes e o mundo exterior. Quando uma
classe implementa uma interface, se compromete em fornecer o comportamento publicada
por esta interface. Uma interface contém definições para um grupo de funcionalidades
relacionadas, que uma classe ou um struct pode implementar. Por outro lado, utilizando
interfaces, você pode, por exemplo, incluir o comportamento de várias fontes em uma classe.
Essa funcionalidade é importante em C#, pois a linguagem não dá suporte a herança em
mais de uma classe, ou seja, herança múltipla. Além disso, utilize uma interface se você deseja
simular a herança para structs, pois eles não podem herdar de outro struct ou classe.

Você define uma interface utilizando a palavra-chave interface no lugar da palavra chave
class, como mostrado no exemplo a seguir. E geralmente por convenção e boas práticas é
utilizado a letra maiúscula I no início do nome da interface (MICROSOFT, 2019).

! FIQUE ATENTO!

• Uma interface é como uma classe base abstrata que


contém apenas membros abstratos. Qualquer classe ou
struct que implementa a interface deve implementar todos

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


175
os seus membros.
• Uma interface não pode ser instanciada diretamente. Seus
membros são implementados por qualquer classe ou struct
que implemente a interface.
• As interfaces podem conter propriedades, indexadores,
métodos e eventos.
• As interfaces não têm implementações de métodos.
• Uma classe ou struct pode implementar várias interfaces.
• Uma classe pode herdar uma classe base e também
implementar uma ou mais interfaces.

Uma interface tem as propriedades a seguir (MICROSOFT, 2019):

A Figura 15 representa a modelagem de uma interface com diagrama de classe e sua


representação na linguagem C#.

Figura 15: Exemplo de Interface.

Fonte: Elaborada pelo autor.

Note que, no exemplo (Figura 15), foi implementada uma interface com nome IConta. O
diagrama representado pelo estereótipo <<interface>>, informa que é uma interface. Uma
interface não pode ter atributos de classe, mas como já comentamos anteriormente, em alguns
exemplos vamos implementar como propriedades alguns atributos de classe de determinados
diagramas. Neste caso foi realizado este procedimento, conforme o código do exemplo. Note
também, que foram declaradas apenas as assinaturas dos métodos, pois a responsabilidade
de implementar os métodos será da classe que assinar um contrato (implementar) com a
interface.

Agora vamos analisar como seria uma a assinatura (implementação) de duas classes com a
interface IConta. O diagrama da Figura 16, mostra que existem duas classes Corrente e Conta
que implementam a interface IConta.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


176
Figura 16: Implementação da Interface.

Fonte: Elaborada pelo autor.

O código a seguir (Figura 17) representa a classe Corrente que implementa a interface
IConta.

Figura 17: Classe Corrente Implementando a interface IConta.

Fonte: Elaborada pelo autor.

Note que no exemplo da Figura 17, existem alguns detalhes:

• Na Linha 9, a assinatura com a interface IConta é definida. Veja que a forma de identificar
uma interface é a mesma utilizada na definição de herança, ou seja, com a utilização
de dois pontos e o nome da interface que será implementada pela classe.

• Ao declarar a implementação da interface é obrigatório que a classe Corrente tenha


todas as propriedades e métodos que foram declarados em IConta. Neste momento,

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


177
você percebe uma das diferenças entre Herança e Interface. Pois na herança, a classe
filha não é obrigada a implementar todos os métodos da superclasse, exceto quando
os métodos são declarados como abstratos na superclasse (pai).

• Foi criado um método com nome CalcularTarifa que não existe na interface IConta. Isto
indica que, a classe pode ter propriedades e métodos que não existem na interface que
foi implementada.

Figura 18: Classe Poupanca Implementando a interface IConta.

Fonte: Elaborada pelo autor.

O exemplo da Figura 18, representa a classe Poupanca implementando a interface. Note que
não existe diferença com a classe Corrente, exceto no método CalcularTaxa que não foi criado
na classe Poupanca.

Figura 19: Testando as classes Conta e Corrente.

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


178
O exemplo da Figura 19, representa a utilização das classes Poupanca e Corrente com os
seguintes detalhes:

• Na Linha 13, foi criado um tipo IConta com nome conta. Perceba que a classe não
foi instanciada neste momento. E neste momento, percebemos uma das vantagens
de utilizar interfaces. Pois em tempo de execução, conta pode se tornar uma conta
corrente ou poupança.

• Após definido o tipo de conta que deseja manipular, na linha 20 ou 23 é criada uma
instância da classe Corrente ou Poupanca.

• Nas Linhas 25 a 27, é realizando a manipulação da conta, ao realizar um depósito e


apresentar o saldo na tela.

VAMOS PRATICAR?!
Exercício Resolvido 5:
Utilizando o mesmo exemplo apresentado sobre Interface, crie
uma classe salario que implementa a interface IConta. Adicionar
na classe program a opção 3 para manipular o depósito e saldo
na neste tipo de conta.

6 - ORGANIZANDO MEU CÓDIGO


Para finalizar essa aula, vamos abordar um assunto interessante, como codificar e padronizar
os nomes dos objetos na codificação. Perceba que durante os exemplos que abordamos até
o momento não abordamos sobre como denominar os objetos. Ou seja, será que o nome de
uma variável pode ser maiúsculo? Será que o nome do método deve seguir um padrão? Para
nos auxiliar, existem algumas convenções que podem ser adotadas, entre elas, estão o Pascal
Case e Camel Case.

Mas antes de abordar sobre convenções, vamos analisar um pouco da história. Nas décadas
de 1970 e 1980, começou a ser adotada uma prática de escrita utilizando uma convenção de
nomeação padrão ou alternativa para identificadores em várias linguagens de programação.
A origem precisa desta convenção na programação de computadores não é precisa.
Entretanto, a utilização dessa técnica é recomendada pelas diretrizes de estilo de codificação
de muitas organizações ou projeto de software (KITAMURA, 2019)

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


179
6.1 - PASCAL CASE
No pascal case a primeira letra de toda palavra dos objetos deve ser maiúscula. Geralmente
utilizado para nome dos namespaces, classe, properties e métodos.

6.2 - CAMEL CASE


No camel case a primeira palavra deve ser minúscula e a partir da segunda palavra a primeira
Letra deve ser maiúscula. Geralmente utilizado para nome dos parâmetros de métodos e
variáveis dentro dos métodos.

6.3 - CONVENÇÕES DO .NET


No caso do .NET, a Microsoft possui algumas recomendações. Lembre-se, como não são
obrigatórias (por isso são chamadas de convenções), mas sua utilização facilita a compreensão
do código fonte por outro programador. As convenções de codificação atendem às seguintes
finalidades:

• Criam uma aparência consistente para o código, para que os leitores possam se
concentrar no conteúdo e não no layout.

• Permitem que os leitores entendam o código com mais rapidez, fazendo suposições
com base na experiência anterior.

• Facilitam a cópia, a alteração e a manutenção do código.

• Demonstram as práticas recomendadas do C#.

Como são várias as convenções utilizadas pela Microsoft, sugiro que acesse o material oficial.

saiba mais!
A partir das próximas aulas vamos utilizar o Pascal Case e o Camel Case para definir
o nome dos objetos. Também iremos utilizar algumas convenções da Microsoft. Leia a
documentação da Microsoft sobre convenções da linguagem C# na íntegra. Basta
clicar aqui.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


180
CONECTANDO

Cada empresa adota uma determinada estrutura para organizar a codificação. Em


outras disciplinas você terá outras abordagens sobre padrões que podem auxiliar na
qualidade dos produtos de software.

aUTOaVALIAÇÃO
Após essa aula, você é capaz de desenvolver e aplicar os conceitos de
lista genérica? É capaz de desenvolver e aplicar os conceitos de métodos
estáticos? Consegue desenvolver enum para organizar o código? Caso
você consiga responder estas questões, parabéns! Você atingiu os objetivos
específicos da Aula 5! Caso tenha dificuldades para responder alguma(s)
dela(s), aproveite para reler o conteúdo da Aula, acessar o UNIARAXÁ Virtual
e interagir com seus colegas e com o(a) tutor(a) e esclarecer todas as suas
dúvidas. Você não está sozinho nessa caminhada! Conte conosco!

RECAPITULANDO
Caro(a) Aluno(a), chegamos ao fim da nossa aula. Espero que tenha compreendido o conteúdo
e resolvido os exercícios. Estudamos sobre tipos de parâmetros dos métodos, classes e métodos
estáticos, implementação de listas e interfaces utilizando a linguagem C#.

Muito bem! Em nossa próxima Aula, vamos continuar nosso estudo sobre Programação Orientada
a Objetos, com ênfase no desenvolvimento de programas com utilização de Lambda e Linq,
conteúdo amplamente utilizado em projetos na linguagem C#.

E, aí, preparado(a) para mais uma jornada de conhecimento?

VIDEOAULA
Após a leitura e o estudo do seu livro-texto, chegou o momento de
complementar seu conhecimento. Vá até seu Ambiente Virtual
de Aprendizagem e acesse a Videoaula referente à Aula.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


181
REFERÊNCIAS
ASCENCIO, Ana Fernanda Gomes; DE CAMPOS, Edilene Aparecida Veneruchi. Fundamentos
da programação de computadores. Pearson Educación, 2008.

CAELUM. C# e Orientação a Objetos. São Paulo. Caelum. 2017.

DEITEL, H.; DEITEL, P.; STEINBUHLER, K. C# Como Programar. 1. ed. São Paulo: Pearson, 2003.

KITAMURA, CELSO. Pascal Case e Camel Case, O que é e como usar. Disponível em: <https://
celsokitamura.com.br>. Acesso em 01 de jul. de 2019.

LINHA DE CÓDIGO. Trabalhando com lista genérica. Disponível em: <http://www.linhadecodigo.


com.br>. Acesso em 01 de jul. de 2019.

MANZANO, José Augusto N. G. Programação de computadores C#. São Paulo: Érica, 2014.

MICROSOFT. Disponível em <https://docs.microsoft.com/pt-br>. Acesso em 01 de jul. de 2019.

SHARP, John; MANIEZ, Dominique. Visual C# 2010. Microsoft Press, 2010. Porto Alegre:
Bookman, 2011.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


182
SUMÁRIO

AULA 6
Objetivos Específicos:

• Trabalhar com arquivos;


• Aplicar tratamento de exceções;
• Desenvolver métodos de extensão;
• Conhecer e desenvolver estruturas utilizando delegates;
• Realizar pesquisas utilizando o LINQ;
• Utilizar expressões lambda no LINQ.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


183
UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS
2
AULA 6 - DESENVOLVENDO DE SOFTWARE
ORIENTADO A OBJETOS - PARTE IV
CONTEXTUALIZANDO A APRENDIZAGEM
Prezado(a) Aluno(a), na Aula anterior, você estudou sobre métodos e classes estáticas, lista
genérica, enumeradores e outros conceitos e estruturas que são características das linguagens
Orientada a Objetos.

Nessa aula, vamos estudar outras estruturas da linguagem C# e conceitos de programação


orientada a objetos, por meio do desenvolvimento de programas. Então, é indispensável que
você tente resolver todos os exercícios propostos.

No final desta Aula, você será capaz de trabalhar com pesquisa utilizando LINQ e outros
conceitos avançados de Programação Orientada a Objetos. Você sabe trabalhar com
expressões lambda? Sabe o que significa tratamento de exceção? Sabe criar delegates?
Nessa aula, você terá as respostas para essas e outras perguntas.

! FIQUE ATENTO!

Fique atento(a), pois a resolução dos exercícios resolvidos estão


disponíveis no AVA (Ambiente Virtual de Aprendizagem). Neste
momento é indispensável o desenvolvimento dos exercícios
utilizando uma IDE.

Boa aula!

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


184
MAPA MENTAL PANORÂMICO
Para contextualizar e ajudá-lo(a) a obter uma visão panorâmica dos conteúdos que você
estudará na Aula 6, bem como entender a inter-relação entre eles, é importante que se atente
para o Mapa Mental, apresentado a seguir:

DESENVOLVENDO SOFTWARE
ORIENTADO A OBJETOS - PARTE IV

TRABALHANDO COM
ARQUIVOS EM C#

TRATAMENTO DE
UTILIZANDO O THROW
EXCEÇÕES

UTILIZANDO USING

MÉTODOS DE EXTENSÃO
(EXTENSION METHODS)

PREDICATE
DELEGATE

ACTION

FUNÇÕES ANÔNIMAS:
EXPRESSÕES LAMBDAS E
MÉTODOS ANÔNIMOS

LINQ (LANGUAGE
INTEGRATED QUERY)

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


185
1 - TRABALHANDO COM ARQUIVOS EM C#
Manipular arquivos é uma atividade comum na programação. Na linguagem C#, é possível
utilizar as classes File, FileStream e FileInfo que estão presentes no namespace System.IO, para
manipular arquivos. A classe File fornece membros estáticos, por outro lado a classe FileInfo e
FileStream necessitam da criação de um objeto (instância). Geralmente, em programas simples
é utilizado o File, por outro lado, se a performance e segurança forem um requisito importante
no software, é possível utilizar a classe FileStream. A seguir, é apresentado um exemplo utilizando
a classe File para manipular um arquivo texto (txt).

Foi criada uma classe Arquivo que terá métodos com a responsabilidade de Criar, Escrever e
Ler um arquivo texto.

Figura 1 - Classe de manipulação de arquivos

Fonte: Elaborada pelo autor.

O exemplo da Figura 1, contém uma classe com três métodos com a seguinte estrutura:

• O primeiro método EscreveCriaArquivoComFile, recebe como parâmetro o nome/


endereço do arquivo e o conteúdo que será gravado. Na Linha 13, ao utilizar o File.
WriteAllText, o arquivo é criado, entretanto, caso o arquivo já exista, o conteúdo é
substituído pelo atual.

• O segundo método CriaArquivoComFile, recebe como parâmetro o nome/endereço


onde o arquivo será criado. Note que, este método apenas cria um arquivo.

• O terceiro método LerArquivoComFile, recebe como parâmetro o nome e endereço do


arquivo. Note que, diferente dos métodos anteriores, este método retorna um valor do
tipo string, com conteúdo do arquivo.

• Não foi necessário criar uma Instância da classe File, pois ela e seus métodos são estáticos.

Em determinados ambientes e situações, podem ocorrer


! FIQUE ATENTO! problemas com a classe File, devido aos seus métodos estáticos.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


186
Figura 2 - Classe de manipulação de arquivos

Fonte: Elaborada pelo autor.

O exemplo da Figura 2, executa os métodos de escrita e leitura de arquivo da classe Arquivo:

• Na Linha 13, é criada uma instância da classe Arquivo.

• Nas Linhas 15 e 16, é solicitada a leitura do texto que será armazenado no arquivo.

• Na Linha 17, o método do objeto arq que é do tipo da classe Arquivo, é invocado,
passando como argumentos o nome e endereço do arquivo e o conteúdo a ser
armazenado. Note que foi adicionado o símbolo @, este procedimento serve para
duplicar as barras (\). No exemplo, a string final será: “D:\\temp\\meuarquivo.txt”. A
necessidade de utilizar duas barras está relacionada com estrutura da linguagem C# e
o Sistema Operacional.

• Na Linha 18, é realizada a leitura e apresentação do conteúdo que foi armazenado no


arquivo.

Na classe File, existem métodos para copiar, verificar se o arquivo


existe e outras tarefas que podem ser úteis na manipulação de
VOCÊ SABIA? arquivo. Além disso, a estrutura apresentada pode ser utilizada
apenas para manipular arquivos não estruturados.

Agora, vamos criar um exemplo, utilizando o FileStream para salvar e pesquisar o conteúdo do
arquivo.

Figura 3 - Classe de manipulação de arquivos FileStream

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


187
Fonte: Elaborada pelo autor.

O exemplo da Figura 3, representa a classe ArquivoStream que contém dois métodos de


manipulação de arquivo com os seguintes detalhes:

• O método SalvarArquivoConteúdo, recebe como parâmetro o nome/endereço do


arquivo e o conteúdo a ser armazenado.

• Entre as Linhas 14 e 16, foi criada uma estrutura utilizando a classe estática File para
verificar se o arquivo existe, caso exista, o arquivo será excluído.

• Na linha 18, foi criado um objeto do tipo StreamWriter com nome file que será utilizado
para criar e gravar o conteúdo no arquivo. Note que foi utilizado o método construtor do
StreamWriter, passando como argumento a variável arquivo. Você deve estar pensando:
o que significa o using? Não se preocupe, pois mais adiante no texto vamos descobrir!

• A estrutura da Linha 20 é responsável por criar e armazenar o conteúdo no arquivo.

• O método LerArquivo, recebe como parâmetro, o nome e endereço do arquivo e lê o


seu conteúdo.

• A estrutura do while percorre o arquivo linha por linha, onde a cada linha encontrada,
o conteúdo é armazenado na variável linha. Em seguida, na Linha 31, foi criada uma
concatenação para agrupar todo o conteúdo encontrado no arquivo.

• Na Linha 34, o arquivo é fechado.

• No final da busca, é realizado um retorno com o conteúdo que foi encontrado (Linha
35).

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


188
Figura 4 - Consumindo um objeto da classe ArquivoStream

Fonte: Elaborada pelo autor.

A Figura 4, representa a estrutura que solicita o conteúdo a ser armazenado e mostra o conteúdo
na tela. Note que a estrutura é idêntica ao exemplo apresentado na Figura 2, por este motivo,
não vamos detalhar a sua estrutura.

Nesta Seção, foram apresentados alguns exemplos de manipulação de arquivos. Porém,


existem outras estruturas e métodos que podem ser utilizados na manipulação de arquivos.

VAMOS PRATICAR?!
Exercício Resolvido 1:
Utilizando os exemplos apresentados anteriormente, crie um
programa orientado a objetos para receber o nome do arquivo
e endereço do arquivo. Após receber os dados, arquivo deve ser
salvo. Crie na classe de manipulação de arquivos, um método que
realiza a cópia do conteúdo de dois arquivos, este método deve
receber como parâmetros os nomes e endereços dos arquivos.

saiba mais!
Para conhecer a estrutura completa do FileStream, clique aqui.

2 - TRATAMENTO DE EXCEÇÕES
Durante a manipulação de um arquivo, podem ocorrer exceções, por exemplo, um bloqueio
de acesso do sistema operacional, um arquivo que não existe, ou seja, qualquer exceção
inesperada. Então, como tratar essas exceções?

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


189
Felizmente, na linguagem C# e outras linguagens orientadas a objetos, existem recursos de
manipulação de exceção que ajudam você a lidar com situações excepcionais ou inesperadas
que ocorram quando um programa for executado. A manipulação de exceção utiliza as
palavras-chave try, catch e finally para executar ações que podem não ser bem-sucedidas,
lidar com falhas quando decidir se é razoável fazer isso e limpar recursos posteriormente. As
exceções podem ser geradas pelo CLR (Common Language Runtime), pelo .NET Framework,
por quaisquer bibliotecas de terceiros ou pelo código do aplicativo. Outra forma seria o
lançamento explícito de exceção utilizado a termo throw (MICROSOFT, 2019).

Em muitos casos, uma exceção pode ser lançada, não por um método que seu código
chamou diretamente, mas por outro método, mais abaixo na pilha de chamadas. Quando
isso acontecer, o CLR desempilha a pilha, procurando por um método com um bloco catch
para o tipo de exceção específico. Então, primeiro, o bloco catch que for encontrado será
executado. Se não for encontrado nenhum bloco catch apropriado na pilha de chamadas, o
processo será encerrado e exibirá uma mensagem para o usuário (MICROSOFT, 2019).

A Figura 5 representa a estrutura de um tratamento de exceção utilizando o bloco try/catch/


finally. Considere que fosse possível adicionar vários blocos catch, de acordo com erros
específicos. Além disso, note que o objeto erro, dentro do catch, contém informações sobre o
erro, por exemplo, a mensagem e código da exceção.

Geralmente, dentro do bloco catch é criado um log com os


! FIQUE ATENTO!
dados do erro, para que seja consultado no futuro.

Figura 5 - Tratamento de exceção

Fonte: Elaborada pelo autor.

A seguir, vamos alterar o exemplo de manipulação de arquivos apresentado na Figura 3 e criar


um controle de exceção com a estrutura try, catch e finally.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


190
Figura 6 - Exemplo do bloco try

Fonte: Elaborada pelo autor.

O exemplo da Figura 6, representa a manipulação de arquivo com a utilização de exceção


com as seguintes características:

• Se ocorrer um erro entre as Linhas 28 e 38, é lançada uma exceção e o código da linha
41 ou 45 serão executados.

• Note que existem dois blocos catch, isto é comum e pode ser utilizado, pois, o primeiro
catch trata um erro específico de leitura e entrada, ou seja, se ocorrer um erro durante a
leitura do arquivo, o primeiro bloco será executado. O segundo bloco é um tratamento
de erro genérico, ou seja, se o erro não for relacionado à arquivos, o segundo bloco será
executado.

• Note que dentro dos blocos catch, foi utilizado o objeto erro para mostrar a mensagem
de exceção na tela.

As exceções têm as seguintes propriedades (MICROSOFT, 2019), de acordo com o Quadro a


seguir.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


191
Quadro 1 – Propriedades das Exceções

PROPRIEDADES DAS EXCEÇÕES

• As exceções são tipos que derivam namespace System.Exception.

• Use um bloco try nas instruções que podem lançar exceções.

• Quando ocorre uma exceção no bloco try, o fluxo de controle vai para o primeiro
manipulador de exceção associado, que está presente em qualquer lugar na pilha de
chamadas. No C#, a palavra-chave catch é usada para definir um manipulador de
exceção.

• Se nenhum manipulador de exceção para uma determinada exceção estiver presente,


o programa interrompe a execução com uma mensagem de erro.

• Não capture uma exceção, a menos que você possa manipulá-la e deixar o aplicativo
em um estado conhecido. Se você capturar System.Exception, relance-o usando a
palavra-chave throw no final do bloco catch.

• Se um bloco catch define uma variável de exceção, você pode usá-lo para obter
mais informações sobre o tipo de exceção que ocorreu.

• As exceções podem ser geradas explicitamente por um programa usando a palavra-


chave throw.

• Os objetos de exceção contêm informações detalhadas sobre o erro, como o estado


da pilha de chamadas e uma descrição de texto do erro.

• O código em um bloco finally será executado, mesmo se uma exceção for lançada.

• Utilize um bloco finally para liberar recursos, por exemplo, para fechar todos os fluxos
ou arquivos que foram abertos.
Fonte: MICROSOFT (2019).

2.1 - UTILIZANDO O THROW


Agora que você já aprendeu a criar uma exceção com bloco try, vamos aprender a utilizar
o throw para realizar o lançamento de exceções explícitas. O throw é uma instância de uma
classe derivada de System.Exception. O exemplo a seguir utiliza a instrução throw para gerar
um IndexOutOfRangeException se o argumento passado para o método PegarNumero não
corresponder com um índice válido, de acordo com tamanho do vetor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


192
Figura 7 - Exemplo do throw

Fonte: Adaptada de MICROSOFT (2019).

Ao analisar o exemplo da Figura 7, perceba que na Linha 14 é realizado um teste se o índice


está fora do permitido (entre 0 e 9), pois o vetor possui apenas 10 posições. Então, caso seja
verdade, a linha 16 é executada e uma exceção é lançada sem que ocorra uma interrupção.

Outra aplicação do throw seria a utilização para gerar novamente, uma exceção tratada em
um bloco catch. Neste caso, o throw não utiliza um operando de exceção.

Figura 8 - Exemplo do throw dentro do catch

Fonte: Elaborada pelo autor.

No exemplo da Figura 8, se for passado um valor fora do índice será gerada uma exceção e o
throw dispara para o método chamador.

saiba mais!
Para conhecer a estrutura completa do tratamento de exceção, clique aqui.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


193
VAMOS PRATICAR?!
Exercício Resolvido 2:
Altere o Exercício Resolvido 1, adicionando tratamento de erro
no(s) método(s) com mensagens personalizadas sobre o tipo de
erro. Por exemplo, se o arquivo não existir, deve apresentar a
mensagem: “O arquivo não existe”.

3 - UTILIZANDO USING
Nessa aula, foi o utilizado o termo using. Então, vamos compreender qual a sua aplicação. O
using garante que Dispose que é responsável por liberar a memória, antes do coletor de lixo
(Garbage Collector) entre em ação. Você pode obter o mesmo resultado, colocando o objeto
dentro de um bloco try e então, chamando Dispose em um bloco finally. Na verdade, é dessa
forma que a instrução using é convertida pelo compilador. De acordo com a MICROSOFT, o
using possui três aplicações:

i) a instrução using define um escopo no final do qual um objeto será descartado;

ii) a diretiva using cria um alias para um namespace ou importa tipos definidos em
outros namespaces;

iii) a diretiva estática using importa os membros de uma única classe.

A seguir, temos um exemplo da utilização do using. Note que a estrutura responsável por ler um
arquivo foi adicionada dentro do using.

O exemplo anterior se expande para o código a seguir, em tempo de compilação.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


194
DICA DO AUTOR
Como sugestão, considere a utilização do using, quando for manipular algum
objeto que utiliza algum recurso reservado ou objeto, que precisa ser liberado
antes do coletor de lixo entrar em ação.

4 - MÉTODOS DE EXTENSÃO (EXTENSION METHODS)


Os métodos de extensão permitem que você “adicione” tipos existentes, sem criar um novo
tipo derivado, recompilar ou, caso contrário, modificar o tipo original. Os métodos de extensão
são um tipo especial de método estático, mas são chamados como se fossem métodos de
instância no tipo estendido. No caso do código utilizando C#, F# e Visual Basic, não existe
nenhuma diferença aparente entre chamar um método de extensão e os métodos realmente
definidos em um tipo. Os métodos de extensão mais comuns são os operadores de consulta
padrão LINQ, que adicionam funcionalidade de consulta aos tipos System.Collections.
IEnumerable, System.Collections.Generic.IEnumerable<T>
existentes (MICROSOFT, 2019). Resumidamente, um método
de extensão estende uma funcionalidade de um tipo, sem GLOSSÁRIO
alterar o código fonte do tipo.

Confuso não é verdade? Então, vamos criar um exemplo de REUSABILIDADE


método de extensão. Imagine que você precise converter
É processo de criação
uma data para o padrão extenso, por exemplo, 21/09/1979
de programas a partir de
seria representado por: Araxá 21 de setembro de 1979.
módulos, classes ou software
Você teria a opção de criar um método para realizar este
já existentes. Por exemplo,
procedimento ou realizar a análise no local onde será
ao criar uma classe com
apresentado o resultado. Porém, reusabilidade é uma das
dois métodos para calcular
características mais importante da programação orientada
o juro composto e simples.
a objeto. Então, criar um método seria a melhor opção, não
Esses métodos, podem ser
é verdade? Mas seria mais interessante, se essa opção fosse
utilizados em qualquer parte
transparente e reutilizável, ou seja, com a opção de utilizar
do programa.
este método dentro de qualquer objeto do tipo DateTime.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


195
Figura 9 - Classe ExtensaoData

Fonte: Elaborada pelo autor.

O código presente na Figura 9, representa a criação de uma classe para inserir as extensões no
tipo DateTime, conforme detalhado a seguir:

• Toda classe, que possui método de extensão, deve ser estática (static).

• Na Linha 11, perceba que foi criado um método com nome DataPorExtenso. Nos
parâmetros foi adicionar o termo this, que indica que é um método de extensão que
será adicionado dentro do tipo Datetime. Para utilizar o método, não é necessário passar
uma data para o parâmetro objeto, além disso, como é uma extensão, ele pode ser
utilizado em qualquer variável do tipo DateTime.

• A Linha 13, retorna o mês atual, de acordo com a informação regional de idioma do
sistema operacional.

• Na Linha 14, a variável recebe a data por extenso, em seguida, o valor é retornado.

Figura 10 – Teste do método de extensão

Fonte: Elaborada pelo autor.

O exemplo da Figura 10, mostra como utilizar um método de extensão, com as seguintes
características:

• Entre as Linhas 13 e 15, foi criada uma variável do tipo DateTime e solicitado a data que
deseja utilizar.

• Na Linha 16, ao colocar data.DataPorExtenso o método de extensão é invocado e a data


por extenso é apresentada na tela. A Figura 11 mostra que o método DataPorExtenso ,
agora faz parte dos métodos de todos os tipos DateTime do Programa.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


196
Figura 11 - Intellisense do tipo DateTime

Fonte: Elaborada pelo autor.

Você pode utilizar métodos de extensão para estender uma classe ou interface, mas não para
substituí-los. Um método de extensão, com o mesmo nome e assinatura que um método de
interface ou classe, nunca será chamado. Em tempo de compilação, os métodos de extensão
sempre têm menor prioridade que os métodos de instância definidos no próprio tipo. Em outras
palavras, se um tipo possuir um método chamado Processar(int i), e se você tiver um método
de extensão com a mesma assinatura, o compilador sempre se associará ao método de
instância. Quando o compilador encontra uma invocação de método, primeiro ele procura
uma correspondência nos métodos de instância do tipo. Se nenhuma correspondência for
encontrada, ele irá procurar todos os métodos de extensão definidos para o tipo e associará
ao primeiro método de extensão que encontrar (MICROSOFT, 2019).

DICA DO AUTOR
A extensão pode ser uma estrutura importante para organizar o código e definir
algumas extensões de classe e interfaces. Porém, antes de utilizar, analise as
vantagens e desvantagens dentro do produto de software que será desenvolvido.
Lembre-se que cada produto de software pode possuir características diferentes.
Além disso, analise se herança não seria uma melhor opção.

VAMOS PRATICAR?!
Exercício Resolvido 3:
Crie uma classe de extensão para o tipo Decimal. Esta classe deve
conter um método de extensão responsável por receber um valor
decimal e retornar à descrição por extenso. Por exemplo, se for
passado 10,90, deve retornar: dez reais e noventa centavos.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


197
5 - DELEGATE
Um delegate é um tipo que representa referências aos métodos com lista de parâmetros e
tipo de retorno específicos. Ao instanciar um delegate, você pode associar sua instância a
qualquer método, com assinatura e tipo de retorno compatíveis.

Delegates são utilizados para passar métodos, como argumento a outros métodos. Por outro
lado, os manipuladores de eventos nada mais são, do que métodos chamados por meio de
delegates. Ao criar um método personalizado, uma classe como um controle do Windows
poderá chamá-lo quando um determinado evento ocorrer (MICROSOFT, 2019).

! FIQUE ATENTO!

No contexto da sobrecarga de método, a assinatura de um método não inclui o valor


retornado. No entanto, no contexto de delegates, a assinatura inclui o valor retornado.
Em outras palavras, um método deve ter o mesmo tipo de retorno que o delegate.

A capacidade de se referir a um método como um parâmetro, torna os delegates ideais


para definir métodos de retorno de chamada. Por exemplo, uma referência a um método,
que compara dois objetos, poderia ser passada como um argumento para um algoritmo
de classificação. Como o código de comparação está em um procedimento separado, o
algoritmo de classificação pode ser escrito de forma mais geral (MICROSOFT,2019).

Os delegates têm as seguintes propriedades (MICROSOFT, 2019), de acordo com o Quadro a


seguir.

Quadro 2 – Propriedades dos Delegates

PROPRIEDADES DOS DELEGATES


• São semelhantes a ponteiros de função do C++, mas delegates são totalmente orientados
a objeto e, ao contrário dos ponteiros de C++ para funções de membro, os delegates
encapsulam uma instância do objeto e um método.
• Os delegates permitem que métodos sejam passados como parâmetros.
• Os delegates podem ser utilizados para definir métodos de retorno de chamada.
• Os delegates podem ser encadeados juntos, por exemplo, vários métodos podem ser
chamados um único evento.
• O C# versão 2.0 introduziu o conceito de Métodos Anônimos, que permitem que blocos de
código sejam passados como parâmetros em vez de um método definido separadamente.
O C# 3.0 introduziu expressões lambda como uma maneira mais concisa

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


198
separadamente. O C# 3.0 introduziu expressões lambda como uma maneira mais concisa
de escrever blocos de código embutidos. Os métodos anônimos e as expressões lambda
(em determinados contextos) são compilados para tipos delegates. Juntos, esses recursos são
agora conhecidos como funções anônimas.
Fonte: MICROSOFT (2019).

Na linguagem C#, existem três tipos de delegates pré-definidos: Func, Action e Predicate. Mas
adiante, vamos analisar as suas aplicações. Entretanto, antes de analisar esses tipos, vamos
aprender como utilizar o delegate.

Na aula anterior, criamos um programa com uma classe para calcular o juro composto e
simples, então vamos utilizar os mesmos exemplos.

Figura 12 - Classe de cálculo de Juros

Fonte: Elaborada pelo autor.

O exemplo da Figura 12, representa uma classe Calculo, que possui dois métodos para calcular
o juro composto e simples. Note que, a quantidade de parâmetros é idêntica, entretanto o
cálculo é diferente.

A seguir, vamos analisar como é possível utilizar os métodos utilizando delegate.

Figura 13 - Utilizando delegate

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


199
Fonte: Elaborada pelo autor.

O exemplo da Figura 13, representa a criação de delegate, com as seguintes características:

• Na Linha 9, é criado o delegate com nome CalculandoJuros que informa que a assinatura
deve receber dois parâmetros do tipo double e um do tipo int. Note que a criação deve
ser antes da declaração do nome da classe.

• Entre as Linhas 14 e 21, é criado a estrutura para receber o valor do capital, taxa de juro
mensal e quantidade de meses.

• Nas Linhas 23 e 24, são atribuídos dois valores delegate. O primeiro é o cálculo do juro
composto, o segundo de juros simples. Então, os itens composto e simples a partir deste
momento, representam as funções JuroComposto e JuroSimples.

• Nas Linhas 26 e 27, composto e simples são utilizados para calcular os valores. Em seguida,
o resultado é apresentado na tela.

O interessante que, o delegate CalculandoJuros pode receber qualquer método que tenha a
mesma assinatura, ou seja, dois parâmetros do tipo double e um inteiro.

saiba mais!
Seria possível substituir o exemplo de delegate apresentado nas Figuras 12 e 13 por
multcast delegates. Para saber mais, clique aqui.

A seguir, teremos dois exemplos dos delegates Predicate e Action. Mais adiante, teremos
exemplos do Func ao utilizarmos o LINQ.

5.1 - PREDICATE
O delegate predicate define uma função que recebe um objeto do tipo T e retorna um valor
booleano.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


200
Vamos criar um exemplo com uma lista de objetos do tipo Aluno, que deve possuir apenas
código e nome. E para utilizar o predicate, vamos simular a remoção de todos os alunos com
código menor ou igual a 0 da lista.

Figura 14 - Classe Aluno

Fonte: Elaborada pelo autor.

O exemplo da Figura 14, representa a classe Aluno, com os seguintes detalhes:

• Foi criado um método construtor entre as linhas 14 e 18, para receber o código e o nome do
aluno. Como já foi descrito em outro momento, o termo this conforme apresentado neste
exemplo, serve para identificar o item é uma propriedade ou variável da classe.

• Na linha 20, temos algo novo. Note que, o método ToString() foi sobreposto. Como já foi
discutido em outra aula, toda classe herda da classe Object, e o método ToString() é um
método virtual da classe Object que pode ser sobreposto. Então, conforme a estrutura deste
método, ao chamar o método ToString(), será retornado a concatenação entre o código
e o nome do aluno.

Figura 15 - Testando o predicate

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


201
O exemplo da Figura 15, realiza a manipulação da lista e utiliza o predicate para remover os
itens:

• Entre as Linhas 13 e 17, é criada a lista e são adicionados 4 objetos do tipo Aluno na Lista.

• Entre as Linhas 19 e 23, os alunos cadastrados na lista são apresentados na tela.

• Na linha 25, está o exemplo de predicate, utilizando o RemoveAll da lista. Note que foi
criado uma expressão lambda “p => p.codigo <=0”, para remover todos os alunos com
código menor ou igual a zero. Você deve estar pensando: o que é expressão lambda?
Fique tranquilo, mais adiante na disciplina vamos discutir sobre este assunto.

5.2 - ACTION
Action encapsula um método que tem um único parâmetro e não retorna um valor. Vamos
analisar um exemplo prático.

Utilizando a mesma estrutura do exemplo anterior, vamos somar o número 100 em todos os
códigos dos alunos. Por exemplo, 1 será igual a 101 e assim por diante. Neste momento, seria
possível utilizar uma função lambda, mas para criarmos um exemplo diferente, vamos criar um
método para realizar a soma.

Figura 16 - Testando o action

Fonte: Elaborada pelo autor.

O exemplo da Figura 16, realiza a manipulação da lista e utiliza o action com as seguintes
características:

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


202
• Entre as linhas 13 e 17, é criada a lista e são adicionados 4 objetos do tipo Aluno na Lista.

• Entre as Linhas 29 e 32, foi criado um método que recebe um objeto do tipo Aluno e realiza
a soma do código mais 100.

• A Linha 19, representa o action. Note que foi utilizado o ForEach e passado como argumento,
o nome do método Atualizar. Então, todos os itens da lista serão atualizados. Em seguida, os
dados são apresentados na tela (Linhas 22 a 25).

No lugar do método, seria possível utilizar uma função lambda, conforme o exemplo a seguir.
Neste exemplo, não é utilizado o método. E ao colocar o código lambda entre chaves, indica
que não terá retorno

6 - FUNÇÕES ANÔNIMAS: EXPRESSÕES LAMBDAS E MÉTODOS ANÔNIMOS


Agora que você aprendeu sobre delegate, vamos aprender sobre funções anônimas, em
especial, vamos dar uma maior ênfase nas expressões lambda que podem substituir as funções
anônimas.

Uma função anônima é uma instrução “in-line” ou expressão que pode ser usada sempre que
um tipo de delegate é esperado. Podemos usá-las para inicializar um delegate nomeado ou
passar uma função anônima, em vez de um tipo de delegate nomeado como um parâmetro
de método (MICROSOFT, 2019). Existe dois tipos de funções anônimas: Expressões lambda e
métodos anônimos.

Nas versões anteriores à versão 2.0 da linguagem C#, a única maneira de declarar um delegate
era usando métodos nomeados. A partir da versão 2.0, a linguagem C# introduziu os métodos
anônimos e no C# 3.0 e posterior, as expressões lambdas substituem os métodos anônimos
como a melhor maneira de escrever código “in-line”. Uma expressão lambda é uma função
anônima que pode conter expressões e instruções e pode ser usada para criar delegates ou
tipos de árvore de expressão (MICROSOFT, 2019).

Todas as expressões lambdas utilizam o operador => o que significa “vai para”. A sintaxe geral
de uma expressão lambda pode ser expressa como:

(parâmetros de entrada) => {expressão ou bloco de instrução};

No lado esquerdo do operador lambda, temos os parâmetros de entrada, que podem ser tipos
implícitos ou explícitos, a serem passados para o método. No lado direito temos o método,
expressão ou bloco de código que será executado.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


203
EXEMPLIFICANDO

valor => valor % 2 == 1

• valor é o parâmetro de entrada.

• valor % 2 == 1 é a expressão a ser executada.

É possível ler essa expressão da seguinte forma: o parâmetro de


entrada valor vai para função anônima, a qual retorna true, se o
parâmetro de entrada for um número ímpar.

O exemplo a seguir (Figura 17), representa a utilização de uma expressão lambda.

Figura 17 - Exemplo de expressão lambda

Fonte: Elaborada pelo autor.

No exemplo acima, são impressos os números ímpares na tela. Entretanto, o responsável por
apresentar os valores na tela é o foreach. Neste exemplo, foi utilizado o conceito de LINQ,
que será detalhado adiante no texto. Neste exemplo, é aplicado o delegate Func, que já
comentamos nessa aula.

Figura 18 - Exemplo de expressão lambda

Fonte: Elaborada pelo autor.

No exemplo acima (Figura 18), foi utilizado outro exemplo de uma expressão lambda. Note que

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


204
os comandos da Linha 14 mostram na tela, somente os valores que sejam verdadeiros para o
teste: n%2==1. Neste exemplo, foi utilizado o delegate Action, conforme já estudamos.

saiba mais!
Alguns exemplos desta Seção foram retirados desse material aqui.

Não vamos estudar os detalhes sobre função anônima, pois, atualmente a expressão
lambda pode ser utilizada para substituí-la. Mas se quiser conhecer detalhes sobre
funções anônimas, clique aqui.

7 - LINQ (LANGUAGE INTEGRATED QUERY)


Uma consulta LINQ é uma expressão que recupera dados de
GLOSSÁRIO
uma fonte de dados. As consultas normalmente são expressas
em uma linguagem de consulta especializada. Diferentes SQL

linguagens foram desenvolvidas ao longo do tempo para


Structured Query Language,
os diversos tipos de fontes de dados, por exemplo, SQL
ou Linguagem de Consulta
(Structured Query Language).
Estruturada ou SQL, é a
Os desenvolvedores precisam aprender uma nova linguagem de pesquisa
linguagem de consulta para cada tipo de fonte de dados declarativa padrão para
ou formato de dados que eles tinham que oferecer suporte. banco de dados relacional.
Felizmente, o LINQ simplifica essa situação ao oferecer um Muitas das características
modelo consistente para trabalhar com os dados entre vários originais do SQL foram
tipos de fontes e formatos de dados. Em uma consulta LINQ, inspiradas na álgebra
você está sempre trabalhando com objetos. Você utiliza os relacional.
mesmos padrões básicos de codificação para consultar e
transformar dados em documentos XML, bancos de dados SQL, conjuntos de dados do ADO.
NET coleções do .NET e qualquer outro formato para o qual um provedor LINQ estiver disponível
(MICROSOFT, 2019).

SQL - Structured Query Language, ou Linguagem de


CONECTANDO Consulta Estruturada ou SQL, será amplamente discutido
em outras disciplinas.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


205
Todos as operações de consulta LINQ consistem em três ações distintas:

1 - Obter a fonte de dados (data source).

2 - Criar a consulta (query).

3 - Executar a consulta (execution).

O exemplo a seguir, mostra como as três partes de uma operação de consulta são expressas
em código-fonte. O exemplo usa uma matriz de inteiros como uma fonte de dados. Considere
que os mesmos conceitos, também se aplicam a outras fontes de dados com uma lista de
dados.

A Figura 19, mostra a operação de consulta completa. No LINQ, a execução da consulta é


diferente da própria consulta. Em outras palavras, você não recupera dados apenas criando
uma variável de consulta. Os dados serão acessados, somente quando o objeto que recebeu
a consulta LINQ for invocado.

Figura 19 - Exemplo de LINQ

Fonte: Adaptada de MICROSOFT (2019).

No exemplo da Figura 19, na linha 15 é criado um vetor com 7 valores. Entre as linhas 19 e 22,
está a consulta (query). Entre as linhas 25 e 28, é executada a pesquisa pelo LINQ. Note que,
somente a criação da consulta (Linhas 19 a 22) não executa a consulta, ou seja, é necessário
a execução do foreach.

Conforme afirmado anteriormente, uma consulta LINQ precisa de três estruturas: 1) o data
source onde estão os dados, ou seja, uma base de dados, vetor, etc; 2) a estrutura da consulta
(query); 3) a execução da consulta.

Existem algumas vantagens da consulta com LINQ, entre elas:

a) suporte do intellisense da IDE Visual Studio;

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


206
b) pode ser utilizado linguagem lambda e expressões idênticas a linguagem SQL.

Com base no exemplo da Figura 19, vamos criar mais exemplos para auxiliar na compreensão.
No exemplo a seguir, vamos criar uma classe ControleNumero, que contém um método que
recebe um parâmetro do tipo inteiro e apresenta na tela, todos os números do vetor maior
que o valor passado como argumento. Um detalhe, para utilizar o LINQ é necessário declarar
o namespace System.Linq.

Figura 20 - Exemplo de LINQ com variável

Fonte: Elaborada pelo autor.

O exemplo da Figura 20, representa a classe ControleNumero, com as seguintes características:

• O método recebe como parâmetro um valor inteiro.

• Na Linha 14, é criado um vetor com 10 posição, com valores de 0 a 10. Esta estrutura
representa a fonte de dados (data source)

• Entre as Linhas 16 e 18, é realizada a consulta LINQ utilizando uma expressão idêntica ao
SQL. Esta estrutura representa a consulta (query).

• O foreach entre as Linhas 21 e 25, representa a execução da consulta.

• A variável numQuery é do tipo IEnumerable<>. Então, você pode substituir o var por
IEnumerable<int>.

Figura 21- Utilizando a classe ControleNumero

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


207
O exemplo da Figura 21, cria um objeto num do tipo da classe ControleNumero, recebe como
entrada um valor int e executa o método Procurar.

Fantástico! Você agora sabe utilizar o LINQ na linguagem C#. Na próxima aula, vamos estudar
mais alguns exemplos com LINQ! Agora tente resolver o exercício proposto a seguir, para
concretizar o seu aprendizado.

VAMOS PRATICAR?!
Exercício Resolvido 4:
Altere o exemplo apresentado anteriormente e crie um segundo
método na classe ControleNumero, que pesquise apenas
os números pares de um vetor. Apresente na tela, os valores
multiplicados por 10. Para facilitar, coloque o vetor como atributo
de classe, para que seja utilizado pelos dois métodos.

aUTOaVALIAÇÃO
Após essa aula, você é capaz de desenvolver pesquisas utilizando LINQ?
É capaz de aplicar tratamento de exceção? Consegue criar métodos de
extensão? Caso você consiga responder estas questões, parabéns! Você
atingiu os objetivos específicos da Aula 6! Caso tenha dificuldades para
responder alguma(s) dela(s), aproveite para reler o conteúdo da Aula,
acessar o UNIARAXÁ Virtual e interagir com seus colegas e com o(a) tutor(a)
e esclarecer todas as suas dúvidas. Você não está sozinho nessa caminhada!
Conte conosco!

RECAPITULANDO
Caro(a) Aluno(a), chegamos ao fim da nossa aula. Espero que tenha compreendido o conteúdo
e resolvido os exercícios. Estudamos sobre manipulação de arquivos, métodos de extensão,
delegates, LINQ, expressões lambda e outras estruturas da linguagem C#.

Muito bem! Em nossa próxima Aula, vamos continuar nosso estudo sobre Programação
Orientada a Objetos, porém, vamos trabalhar com desenvolvimento de aplicações gráficas
utilizando o Windows Forms.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


208
E, aí, preparado(a) para mais uma jornada de conhecimento?

VIDEOAULA
Após a leitura e o estudo do seu livro-texto, chegou o momento de
complementar seu conhecimento. Vá até seu Ambiente Virtual
de Aprendizagem e acesse a Videoaula referente à Aula.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


209
REFERÊNCIAS
MANZANO, José Augusto N. G. Programação de computadores C#. São Paulo: Érica, 2014.

MICROSOFT. Disponível em <https://docs.microsoft.com/pt-br>. Acesso em 14 de abr. 2019.

SHARP, John; MANIEZ, Dominique. Visual C# 2010. Microsoft Press, 2010.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


210
SUMÁRIO

AULA 7
Objetivos Específicos:

• Praticar exemplos de LINQ;


• Desenvolver projetos com interface gráfica com Windows Forms;
• Criar projetos DLL (Class Library).

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


211
UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS
2
AULA 7 - PROGRAMAÇÃO ORIENTADA
A OBJETOS E AS LINGUAGENS DE
PROGRAMAÇÃO
CONTEXTUALIZANDO A APRENDIZAGEM
Prezado(a) Aluno(a), na Aula anterior você estudou sobre delegates, métodos de extensão,
consultas com LINQ e outros conceitos da linguagem C#.

Nessa aula, vamos estudar outros exemplos sobre LINQ, desenvolvimento de projetos utilizado
uma interface gráfica e criação de DLLs. Então, é indispensável que você tente resolver todos
os exercícios propostos.

No final dessa Aula, você será capaz de trabalhar com projetos Windows Forms, desenvolver
pesquisas utilizando o LINQ e outros conceitos da linguagem C#. Você sabe trabalhar com
DLL? Consegue desenvolver projetos Windows Forms? Nessa aula, você terá as respostas para
essas outras perguntas.

! FIQUE ATENTO!

Fique atento(a), pois a resolução dos exercícios resolvidos estão


disponíveis no AVA (Ambiente Virtual de Aprendizagem). Neste
momento é indispensável o desenvolvimento dos exercícios
utilizando uma IDE.

Boa aula!

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


212
MAPA MENTAL PANORÂMICO
Para contextualizar e ajudá-lo(a) a obter uma visão panorâmica dos conteúdos que você
estudará na Aula 7, bem como entender a inter-relação entre eles, é importante que se atente
para o Mapa Mental, apresentado a seguir:

DESENVOLVENDO SOFTWARE
ORIENTADO A OBJETOS - PARTE V

OUTROS EXEMPLOS
DE LINQ (INTEGRATED
LANGUAGE QUERY)
CRIANDO O PRIMEIRO
EXEMPLO WINDOWS
FORMS

CRIANDO PROJETOS CRIANDO UM EXEMPLO


GRÁFICOS COM POO UTILIZANDO
WINDOWS FORMS WINDOWS FORMS

CRIANDO UM EXEMPLO
DE APRESENTAÇÃO DE
DADOS

CRIANDO O PRIMEIRO
PROJETOS CLASS LIBRARY EXEMPLO DE CLASS
(BIBLIOTECA DE CLASSES) LIBRARY (BIBLIOTECA DE
CLASSES)

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


213
1 - OUTROS EXEMPLOS DE LINQ (INTEGRATED LANGUAGE QUERY)
Na aula anterior, estudamos sobre LINQ, que é uma estrutura
muito utilizada por desenvolvedores da linguagem C#. Por
isto, vamos desenvolver um exemplo com mais detalhes para GLOSSÁRIO
auxiliar no seu aprendizado. Mas antes, vamos relembrar o
que é LINQ. Uma consulta LINQ (Language Integrated Query) SQL
é uma expressão que recupera dados de uma fonte de
Structured Query Language
dados. Sem o LINQ, as consultas normalmente são expressas
ou Linguagem de Consulta
em uma linguagem de consulta especializada, pois diferentes
Estruturada ou SQL, é a
linguagens foram desenvolvidas ao longo do tempo para
linguagem de pesquisa
os diversos tipos de fontes de dados, por exemplo, SQL
declarativa padrão para
(Structured Query Language), e os desenvolvedores precisam
banco de dados relacional.
aprender uma nova linguagem de consulta para cada tipo
As características originais
de fonte de dados ou formato de dados que eles tinham que
do SQL foram inspiradas na
oferecer suporte. Felizmente, o LINQ simplifica essa situação
álgebra
ao oferecer um modelo consistente para trabalhar com
os dados entre vários tipos de fontes e formatos de dados.
Em uma consulta LINQ, você está sempre trabalhando com objetos. Você utiliza os mesmos
padrões básicos de codificação para consultar e transformar dados em documentos XML,
bancos de dados SQL, conjuntos de dados do ADO.NET, coleções do .NET e qualquer outro
formato para o qual um provedor LINQ estiver disponível (MICROSOFT, 2019).

Então vamos lá! Para finalizar o aprendizado sobre LINQ e Expressões lambda, vamos desenvolver
o nosso último exemplo!

A Figura 1 representa o diagrama de classe para controlar o cadastro de funcionários e os


departamentos de uma empresa. Então, vamos criar duas classes e uma lista para manipular e
relacionar esta estrutura. Note no exemplo, que o funcionário precisa obrigatoriamente possuir
um departamento.

Figura 1: Diagrama de Classe: departamento e funcionário

Fonte: Elaborada pelo autor.

O código da Figura 2, representa as classes Funcionario e Departamento.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


214
Figura 2: Classes Departamento e Funcionario

Fonte: Elaborada pelo autor.

Agora vamos criar um exemplo na classe Program para manipular as duas classes, por meio de
instâncias e lista. Vamos criar quatro instâncias da classe Departamento e uma lista com várias
instâncias da classe Funcionario. Em seguida, vamos desenvolver algumas pesquisas utilizando
o LINQ com expressões Lambda.

Figura 3: Parte inicial do exemplo de LINQ

Fonte: Elaborada pelo autor.

Note que no exemplo da Figura 3, foram criadas quatro instâncias para o Departamento entre
as linhas 14 e 17. Em seguida, a partir da linha 19, foi criada uma lista do tipo Funcionario
e adicionados quatro funcionários. Este tipo de estrutura pode ser utilizada para facilitar a
inserção de instâncias em uma lista. Note que, para cada instância do funcionário na lista, foi
adicionado uma instância do seu departamento de trabalho. A seguir, vamos apresentar a
segunda parte, com algumas pesquisas utilizando o LINQ.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


215
Figura 4: Parte inicial do exemplo de LINQ

Fonte: Elaborada pelo autor.

O exemplo da Figura 4 representa algumas pesquisas utilizando o LINQ, com as seguintes


características e resultados:

• Entre as linhas 23 e 31, são apresentados na tela, todos os clientes com código acima
de 1012. Note que na linha 27, é utilizado um exemplo do LINQ com a utilização de uma
expressão lambda para retornar todos os clientes com código maior que 1012 (P =>
P.codigo > 1012). Esta expressão lambda é um dos exemplos que podem ser utilizados
para realizar pesquisas. Além disso, foi necessário realizar o foreach para apresentar os
dados na tela.

• Entre as linhas 33 e 38, é apresentado na tela todos os funcionários que possuem o nome
começando com a letra A (P => P.nome[0] ==’A’). No mesmo exemplo, foi aplicado uma
restrição para selecionar apenas o nome (Select(p=> p.nome)). Em seguida, foi realizado
um foreach para apresentar o resultado na tela. Note que, para imprimir foi necessário
utilizar apenas o item (Console.WriteLine(item)), ou seja, não foi necessário adicionar
“.nome”. Note que, ao passar o valor ‘A’, foi utilizado aspas simples (apóstrofo), pois
dados é um char e não uma string.

• Entre as linhas 40 e 45, são apresentados na tela, todos os funcionários que nasceram no
ano 2000. Além disso, foi adicionada uma opção para que os dados sejam apresentados
na ordem crescente de nome (OrderBy(p => p.nome)).

Fantástico! Mas vamos alterar o nosso código e acrescentar outros exemplos. Inicialmente,
vamos alterar o código da classe Funcionario, sobrescrevendo o método toString(), conforme
o exemplo a seguir.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


216
Figura 5: Classe Funcionario alterada

Fonte: Elaborada pelo autor.

Note no exemplo da Figura 5, o método ToString() foi sobrescrito. Esta alteração retornará à
concatenação do código, nome e data de nascimento do funcionário.

Agora vamos alterar a classe Program, para utilizar esta alteração. Mas antes, vamos adicionar
um método que será responsável por imprimir os resultados das pesquisas.

Figura 6: Método Imprimir

Fonte: Elaborada pelo autor.

O exemplo da Figura 6, representa um método responsável por receber uma coleção de


valores do tipo IEnumerable, tipo este que é compatível com o resultado de uma pesquisa
LINQ. Este método terá a responsabilidade de apresentar os valores retornados pelo ToString().
A seguir, vamos analisar como este método é utilizado.

Figura 7: Utilizando o método Imprimir

Fonte: Elaborada pelo autor.

DICA DO AUTOR
Se você não lembra como manipular um tipo de dado DateTime, leia novamente
a Aula 02.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


217
No exemplo da Figura 7, na linha 49 é realizado a pesquisa de todos os funcionários com
data de nascimento no mês de outubro. Em seguida, na linha 50, o método Imprimir (Figura
6) é invocado, passando como parâmetro o resultado da pesquisa LINQ, e os valores são
apresentados na tela. Neste exemplo, apenas o funcionário ARTHUR seria apresentado na tela.

Parabéns!!!! Você já está preparado para utilizar o LINQ. Entretanto, note que utilizamos alguns
exemplos que representam apenas uma parte das possibilidades do LINQ. Contudo, espero
que esteja familiarizado com a estrutura LINQ, pois este conteúdo é amplamente utilizado em
projetos C#.

VAMOS PRATICAR?!
Exercício Resolvido 1:
Crie um projeto com as classes Produto e Departamento, onde
Departamento deve conter o código e a descrição. Produto deve
conter código, descrição, preço de venda e uma instância do
departamento. Utilizando o exemplo apresentado anteriormente,
realize a pesquisa dos produtos que possuem o preço maior que
100,00 e apresente na tela. Fique à vontade para criar outros
exemplos de LINQ.

saiba mais!
A estrutura de LINQ pode ser utilizada em qualquer ambiente. Seja em um projeto Web
MVC, Core, entre outros. Acesse esse link aqui, para conhecer mais detalhes.

Até o momento, utilizamos apenas projetos Console Application, pois o objetivo foi facilitar o
aprendizado sobre a linguagem C# e os conceitos de Programação Orientada a Objetos. A
partir do próximo tópico, vamos iniciar o nosso aprendizado sobre a criação de projetos com
Interface gráfica utilizando Windows Forms.

2 - CRIANDO PROJETOS GRÁFICOS COM WINDOWS FORMS


Então, já que você aprendeu os conceitos de Programação Orientada a objetos e da
linguagem C#, chegou a hora de aprender como desenvolver projetos com interface gráfica.

Em C# existem vários tipos de projetos com interface gráfica, um deles, é baseado em Windows
Forms, ou seja, desenvolvimento baseado em formulários. Formulários são a unidade base do

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


218
seu aplicativo, por isto é essencial dedicar certo planejamento as suas funções e design. Um
formulário é basicamente uma tela em branco que você, como desenvolvedor, aprimora
com controles para criar uma interface do usuário e com código para manipular os dados.
Para esse fim, o Visual Studio fornece um ambiente de desenvolvimento integrado (IDE) para
ajudar a escrever código, bem como um controle sofisticado disponível no .NET Framework.
Complementando a funcionalidade desses controles com seu código, você poderá desenvolver
as soluções com rapidez e facilidade (MICROSOFT, 2019).

Com o Windows Forms, você desenvolve clientes inteligentes. Clientes inteligentes são aplicativos
graficamente ricos que são fáceis de implantar e atualizar, podem funcionar quando eles estão
conectados ou desconectados da Internet e podem acessar recursos no computador local de
maneira mais segura do que os aplicativos tradicionais baseados no Windows. Windows Forms
é uma tecnologia de cliente inteligente para o .NET Framework, é um conjunto de bibliotecas
gerenciadas que simplificam tarefas comuns de aplicativos, como leitura e gravação para
o sistema de arquivos. Quando você usa um ambiente de desenvolvimento como o Visual
Studio, você pode criar aplicativos Windows Forms que exibem informações, solicitam entrada
de usuários e se comunicam com computadores remotos em uma rede. Nos Windows Forms,
um formulário é uma superfície visual, na qual são exibidas informações para o usuário.
Normalmente, os aplicativos são compilados com o acréscimo de controles a formulários e de
respostas de desenvolvimento a ações do usuário, como cliques do mouse ou pressionamento
de teclas. Vale ressaltar que um controle é um elemento discreto de interface do usuário, que
exibe dados ou aceita a entrada de dados.

Quando um usuário executa alguma ação em seu formulário ou em um de seus controles, a


ação gera um evento. O seu aplicativo reage a esses eventos usando código e os processa
quando eles acontecem. O Windows Forms contém uma variedade de controles que podem
ser adicionados aos formulários, por exemplo: controles que exibem caixas de texto, botões,
caixas suspensas, botões de opção e até mesmo páginas da Web. Por outro lado, se um controle
existente não atender às suas necessidades, os formulários do Windows também oferecem
suporte à criação de seus próprios controles personalizados usando a classe UserControl. Com
o arrastar e soltar do designer de formulários no Visual Studio, você pode criar facilmente
aplicativos de formulários. Basta selecionar os controles com o seu cursor e adicioná-los no
local do formulário desejado. Além disso, o designer oferece várias ferramentas, como linhas
de grade e linhas de alinhamento para facilitar o alinhamento dos controles. Por outro lado, se
for necessário, você pode criar seus próprios elementos personalizados da interface do usuário,
o System.Drawing namespace que contém uma seleção de classes para renderizar linhas,
círculos e outras formas diretamente em um formulário (MICROSOFT, 2019).

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


219
CONECTANDO

Atualmente a tendência é a perda de mercado do Windows Forms para projetos


Web. Entretanto, neste momento nosso objetivo é utilizar o Windows Forms para
representar os conceitos de programação orientada a objetos em um ambiente
gráfico. Fique tranquilo(a), pois em outras disciplinas do curso, você terá conteúdos
sobre desenvolvimento Web, Mobile, com foco nas tecnologias utilizadas no mercado.
Entretanto, ainda existem muitos projetos Windows Forms no mercado e isso é muito
importante para que você possa dar manutenção e produzir melhorias nos aplicativos
já existentes.

2.1 - CRIANDO O PRIMEIRO EXEMPLO WINDOWS FORMS


Então, vamos criar o nosso primeiro projeto Windows Forms. Ao acessar o Visual Studio, crie um
novo projeto, escolha a opção Visual C#, em seguida, selecione a opção Windows Forms App
(Framework .NET), conforme mostra a Figura 8.

Figura 8: Criando um projeto Windows Forms

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


220
Ao selecionar a pasta e criar o nome da Solution e Project, é criado um projeto Windows Forms
com um formulário (Form1), conforme a Figura 9.

Figura 9: Primeiro projeto Windows Forms

Fonte: Elaborada pelo autor.

Um projeto Windows Forms possui uma estrutura idêntica aos projetos Console que utilizamos
nos exemplos anteriores. A diferença é que, a partir de agora, você terá que lidar com uma
interface gráfica responsável por apresentar e manipular conteúdos. A seguir, vamos analisar
os dois arquivos responsáveis por manipular, controlar eventos e construir a estrutura de um
formulário.

Figura 10: Arquivo Form1.cs

Fonte: Elaborada pelo autor

O exemplo da Figura 10, representa o arquivo Form1.cs que é responsável em controlar os


eventos do Formulário e dos seus componentes. Por exemplo, neste arquivo é possível controlar
o evento do clique em um botão e outras características dos componentes gráficos e não
gráficos. Note que o formulário herda da classe Form, isto é herança, mas lembre-se que
um formulário não é uma classe. Além disso, neste arquivo é possível criar métodos com e

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


221
sem retorno, e outras estruturas que você utilizou em outros exemplos. Além disso, no arquivo
existe um método construtor que possui o mesmo nome do formulário e invoca o método
InitializeComponent(). Este método é responsável em iniciar os componentes do Form1 que
estão presentes no arquivo Form1.Design.cs, apresentado na Figura 11.

Figura 11: Arquivo Form1.Design.cs

Fonte: Elaborada pelo autor.

A Figura 11 representa o arquivo Form1.Design.cs, que possui a configuração dos componentes


do Form1, por exemplo, na linha 26, temos o nome do formulário e na linha 27, o texto que será
apresentado na barra de título. Então, qualquer componente for adicionado ou alterado no
Form1, terá sua configuração adicionada neste arquivo automaticamente, sem a necessidade
de alterar o código manualmente.

Resumindo, cada formulário possui dois arquivos, o .cs que possui os eventos e possíveis métodos,
e o .Design.cs que terá as propriedades e configurações dos componentes e do formulário.

! FIQUE ATENTO!

Evite alterar o arquivo .Design.cs, pois todas as alterações são


atualizadas automaticamente ao adicionar um componente
ou alterar um formulário.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


222
Agora, vamos adicionar um button (botão) e um textbox (entrada de texto) no Form1 e criar
o nosso primeiro exemplo. O objetivo é apresentar uma mensagem dinâmica na tela. Para
adicionar os objetos, basta acessar a toolbox e arrastá-los.

saiba mais!
A Microsoft fornece uma guia de boas práticas para nomear os objetos de projetos.
Por exemplo, qual seria o nome ideal para um button? Acesse o link aqui e veja mais
detalhes.

Figura 12: Adicionando um botão e um campo de texto

Fonte: Elaborada pelo autor.

Conforme a Figura 12, para adicionar um botão e um campo para digitar um texto, é necessário
acessar o menu View e selecionar ToolBox. Em seguida, a barra de ferramenta é apresentada do
lado esquerdo, então, você pode selecionar os itens desejados e arrastá-los para o formulário.
No exemplo, arrastamos um button e um textbox. E ao clicar com botão direito no objeto,
é possível alterar suas propriedades. No nosso exemplo, alteramos o name do textbox para
txtMensagem, o name do button para btnMostrar. Além disso, alteramos o texto apresentado
pelo button para Mostrar Mensagem.

Todos os componentes possuem propriedades e eventos.


Propriedades estão ligadas as suas características, por exemplo,
! FIQUE ATENTO! o nome do botão, sua cor, seu nome, etc. Os eventos estão
relacionados com suas ações, por exemplo, o clique ou o passar
do mouse sobre o botão.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


223
DICA DO AUTOR
Arraste os componentes do ToolBox e veja suas propriedades e possíveis eventos.
Este é um dos caminhos para aprender sobre os componentes.

O trecho de código a seguir mostra o que foi alterado no arquivo Form1.Design.cs ao adicionar
e alterar o button e o textbox no Form1. Note que foi criada uma instância do tipo do button
e textbox, em seguida foi adicionada as configurações de localização, nome e outras
propriedades dos componentes. Entendeu porque eu disse que geralmente não é necessário
alterar este arquivo? Pois nesse exemplo, ao trabalhar na parte gráfica, o Visual Studio atualizou
o arquivo automaticamente. Fantástico, isto parece mágica!

Figura 13: Alteração no arquivo Form1.Design.cs ao adicionar e alterar o button e o textbox no Form1

Fonte: Elaborada pelo autor.

Agora vamos mostrar uma mensagem na tela com conteúdo que for digitado no campo de
texto. Basicamente, existem duas formas de realizar este procedimento. Você pode selecionar
o botão e clicar no ícone de evento na barra de propriedade do botão. Ao clicar, note que
existem vários eventos, entre eles o Click, e ao clicar duas vezes sobre o nome do evento é
criado o evento do Click no arquivo Form1.cs, conforme a Figura 14. O segundo caminho é

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


224
dar um clique duplo no botão, pois, como o principal evento do botão é o clique, será criado
o evento do Click (Figura 14).

Figura 14: Adicionando a mensagem

Fonte: Elaborada pelo autor.

No exemplo da Figura 14, a estrutura entre as linhas 20 e 23 representam o evento do click no


botão, note que a estrutura é idêntica a de um método, e recebe como parâmetro o sender,
que representa o objeto que está sendo manipulado e o parâmetro e, que representa o evento.
Na linha 22, adicionamos o Message.Show que é responsável por mostrar uma mensagem
de diálogo na tela. Em seguida, foi adicionado o txtmensagem.Text. Neste exemplo estamos
utilizando a propriedade de texto do textbox. Se fosse adicionado txtmensagem.name seria
apresentado o nome do textbox na tela. O exemplo da Figura 15, mostra a execução do nosso
primeiro exemplo.

Figura 15: Exemplo da mensagem do Form

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


225
2.2 - CRIANDO UM EXEMPLO POO UTILIZANDO WINDOWS FORMS
Agora que você já sabe como criar um projeto Windows Forms, vamos criar um exemplo
utilizando a programação orientada a objetos. Lembra da classe Conta que utilizamos em
outros exemplos? Vamos relembrar! Criamos uma classe Conta para controlar o saldo e os
dados do titular da conta. Além disso, implementamos um método para realizar depósito
(Figura 16).

Figura 16: Classe Conta

Fonte: Elaborada pelo autor.

Neste exemplo, vamos transformar os atributos em propriedades, conforme o código a seguir.


Além disso, note que o saldo foi encapsulado com o protected, assegurando que apenas a
própria classe e classes filhas possam alterar o seu valor.

Agora, vamos criar uma classe Poupanca que herda da classe Conta. Note na Figura 17, que a
classe herda da classe Conta. Além disso, o método Sacar é sobrescrito.

Figura 17: Classe Poupanca

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


226
Observação: Neste exemplo, não vamos implementar a classe Corrente, porém, seria
basicamente a mesma estrutura da classe Poupanca.

A seguir, vamos criar um formulário com nome frmDepSacar, com os dados para simular um
depósito.

Para adicionar o formulário frmDepSacar, é necessário apenas acessar Project e utilizar a


opção Add Windows Forms. Outro caminho seria clicar com botão direito no nome do projeto
no Solution explorer.

Figura 18: Tela de execução do depósito ou saque

Fonte: Elaborada pelo autor.

A Figura 18, representa o formulário que vamos utilizar para simular um depósito ou saque. Note
que foi utilizado dois textbox, um com nome txtvalor para receber valor do depósito, outro com
nome txtsaldo para receber o saldo após a execução. E para controlar o tipo da execução
(depositar ou sacar), foi criado um combobox com nome cbotipo para receber o tipo da
execução. Por fim, foi criado um botão (button) com nome btnexecutar para executar a ação.
O componente combobox pode ser utilizado para receber uma coleção de dados de um
repositório ou ser preenchido manualmente. Neste exemplo realizamos o seu preenchimento
manualmente com os valores Depositar e Sacar (Figura 19). Note que os valores estão em linhas
distintas, então, automaticamente, eles recebem como índice (index) os valores 0 e 1.

Figura 19: Preenchendo combobox

Fonte: Elaborada pelo autor.

Agora, vamos simular o depósito. Mas antes, conforme o exemplo a seguir, vamos alterar
a classe Program e informar que o primeiro formulário a ser executado será o frmDepSacar,
conforme o exemplo a seguir.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


227
O código a seguir representa a estrutura do arquivo frmDepSacar.cs, com os eventos para
simular o depósito ou saque.

Figura 20: Código frmDepSacar.cs

Fonte: Elaborada pelo autor.

O exemplo da Figura 20, representa a estrutura para realizar o depósito ou saque na classe
Poupanca. Como não estamos utilizando um repositório de dados, criamos uma estrutura para
simular um saldo inicial. A seguir temos mais detalhes:

• Na linha 15, foi criado uma instância (objeto) da classe Poupanca. Perceba que a
instância foi criada como objeto do formulário e não dentro de um evento ou método.
Então, assim que o formulário for criado, o objeto será instanciado.

• Entre as linhas 16 e 17, está a estrutura do método construtor do formulário, que é


responsável por invocar a construção dos componentes do formulário.

• Entre as linhas 21 e 24, utilizamos o evento do carregamento (Load) do formulário.


Obs: este evento pode ser ativado ao dar um clique duplo no formulário. Dentro deste
evento utilizamos o objeto poupanca para simular um saldo inicial de 1.000,00. Como
a propriedade saldo é do tipo protected, ou seja, não é permitido alterar seu valor
diretamente, então utilizamos o método Depositar.

• Entre as linhas 26 e 38, está a estrutura do evento do clique no botão executar. Foi
criado um teste para analisar que tipo de atividade que será realizada, depósito
(selectedindex==0) ou sacar (selectedindex==1). Por fim, na linha 37, o saldo atual é
apresentado na tela.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


228
Fantástico! Neste exemplo, utilizamos herança ao criar as classes Conta e Poupanca.
Encapsulamento, ao bloquear a alteração do saldo com protected, e claro, aprendemos a
consumir uma classe por meio de um formulário gráfico.

VAMOS PRATICAR?!
Utilizando como base o exemplo sobre contas. Crie uma classe
Corrente que herda da classe Conta e simule o depósito e saque
nesta conta.

2.3 - CRIANDO UM EXEMPLO DE APRESENTAÇÃO DE DADOS


Agora, vamos criar um exemplo para manipular uma coleção de dados e apresentar na tela
por meio de um componente DataGridView.

Figura 21: Diagrama de Classe Lista de Telefones

Fonte: Elaborada pelo autor.

A classe na Figura 21, representa a relação de composição entre Lista e Telefone. Note que a
composição define que uma lista é composta por uma coleção de telefones. Então, dentro da
classe Lista teremos uma lista de objetos do tipo Telefone.

Figura 22: Classe Telefone

Fonte: Elaborada pelo autor.

A Figura 22, representa a classe Telefone. Note que existem apenas três propriedades. Vale
lembrar que, no diagrama da Figura 21, as propriedades estão representadas por atributos de
classe, pois não existe representação de propriedades na estrutura UML.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


229
Figura 23: Classe Lista

Fonte: Elaborada pelo autor.

O exemplo da Figura 23, representa a classe Lista, com as seguintes características:

• Na linha 11, é criada uma lista de objetos do tipo Telefone.

• Na linha 12, o método Adicionar recebe como parâmetro um objeto do tipo Telefone,
que possui a responsabilidade de adicionar o objeto na lista.

• Na linha 17, o método Remover recebe como parâmetro um objeto do tipo Telefone, e
possui a responsabilidade de remover o objeto da lista.

• O método PesquisaGeral, retorna a lista de telefones cadastrados.

• O método PesquisaPorNumero, retorna o telefone de acordo com um determinado


número. Note que o método recebe um parâmetro numero do tipo string. Na linha 29,
é realizada uma pesquisa com LINQ utilizando lambda. Neste exemplo o resultado da
pesquisa do LINQ foi convertido em uma lista (toList<Telefone>()) e armazenado em um
tipo lista de telefones (pesquisa). Este é mais um exemplo da utilização do LINQ!

Figura 24: Tela da Lista de Telefone

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


230
Agora, vamos simular um cadastro de lista de telefones utilizando as classes que foram criadas.
A Figura 24 representa a tela do cadastro da lista. Criamos uma estrutura para salvar os dados
do contato e outra para pesquisar, caso seja necessário. Além disso, foi adicionado um
componente DataGridView para receber os resultados da pesquisa.

Figura 25: Código do arquivo frmTelefone.cs

Fonte: Elaborada pelo autor.

A Figura 25 representa a estrutura e eventos do formulário frmTelefone (Figura 24), com as


seguintes características:

• Na linha 15, é criado um objeto do tipo Lista.

• Entre as linhas 20 e 30, está a estrutura do evento do clique no botão salvar. Na linha
22, é criado um objeto do tipo da classe Telefone. Entre as linhas 23 e 26, os dados do
telefone são adicionados na lista. Note que na linha 26, foi utilizado o objeto lista e o
método Adicionar, passando o objeto telefone como parâmetro. Entre as linhas 27 e 29,
é realizada a pesquisa dos telefones cadastrados e o resultado é apresentado na tela
por meio do componente DataGridView. Por fim, o Refresh é utilizado para atualizar os
dados que foram inseridos, mas geralmente em software Windows Forms não é necessário
utilizá-lo. A Figura 26, representa um exemplo do cadastro de dois telefones na lista.

• Entre as linhas 31 e 34, é realizada uma pesquisa de telefone de acordo com número
digitado no txtnumeropesquisa. Note que ao realizar este procedimento o resultado da
pesquisa é apresentado no DataGridView.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


231
Figura 26: Exemplo de cadastro de telefone

Fonte: Elaborada pelo autor.

Fantástico! Estudamos sobre apresentação de um conjunto de objetos no DataGridView.


Utilizamos lista genérica. Além disso, estudamos mais um exemplo da aplicação do LINQ.

VAMOS PRATICAR?!
Crie duas classes Banco e Conta. Onde Banco terá uma
composição de objetos do Tipo Conta. A manipulação deve ser
idêntica ao exemplo que acabamos de estudar. Ou seja, com
opções para salvar e pesquisar contas dentro do formulário.

! FIQUE ATENTO!

Provavelmente, você não terá contato com projetos Windows


Forms em outras disciplinas. Atualmente, os projetos de produtos
de software estão focados em projetos WEB. Entretanto, existem
muitos projetos Windows Forms no mercado que precisam de
profissionais para mantê-los.

3 - PROJETOS CLASS LIBRARY (BIBLIOTECA DE CLASSES)


Provavelmente você já deve ter utilizado uma DLL ou escutou alguém falando sobre esta
sigla? Então, saiba que, por meio da plataforma .NET é possível desenvolver projetos para criar
bibliotecas (DLL). Este tipo de projeto possui o nome de Class Library. Mas antes criar o nosso

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


232
exemplo de Classe Library, vamos compreender o que é uma DLL.

Uma DLL (Dynamic Link Library) é uma extensão de arquivo muito presente no Windows, é uma
biblioteca dinâmica com dados que podem ser acessados por vários programas instalados
no computador. Uma DLL contém código e dados que podem ser usados por mais de um
programa ao mesmo tempo. Por exemplo, em sistemas operacionais Windows, a DLL Comdlg32
executa funções comuns relacionadas à caixa de diálogo. Portanto, cada programa pode
usar a funcionalidade contida dessa DLL para implementar uma caixa de diálogo. Isso ajuda
a promover a reutilização de código e o uso de memória eficiente. Ao usar uma DLL, um
programa pode ser modularizado em componentes separados. Por exemplo, um programa de
contabilidade pode ser vendido por módulo de DLL. Cada módulo pode ser carregado para
o programa principal em tempo de execução se o módulo é instalado. Como os módulos são
separados, o tempo de carregamento do programa é mais rápido e um módulo é carregado
somente quando essa funcionalidade é solicitada. Além disso, as atualizações são mais fáceis
de serem aplicadas a cada módulo, sem afetar outras partes do programa. Por exemplo, você
pode ter um programa de folha de pagamento com as taxas de impostos calculadas por meio
de uma DLL e, quando surgir alguma alteração nos cálculos, essa DLL pode ser atualizada sem
a necessidade de criar ou instalar o programa novamente (MICROSOFT,2019).

A lista a seguir descreve algumas das vantagens que são fornecidas quando um programa usa
uma DLL (MICROSOFT,2019):

• Utiliza menos recursos quando vários programas usam a mesma biblioteca de funções,
uma DLL pode reduzir a duplicação de código que é carregado no disco e na memória
física. Isso pode influenciar o desempenho não apenas do programa que está sendo
executado em primeiro plano, mas também outros programas em execução no sistema
operacional Windows.

• Arquitetura modular de uma DLL ajuda a promover o desenvolvimento de programas


modulares. Isso ajuda a desenvolver programas grandes que requerem versões em vários
idiomas ou um programa que exige arquitetura modular. Um exemplo de um programa
modular é um programa de contabilidade que possui muitos módulos que podem ser
carregados dinamicamente em tempo de execução.

• A implantação e a instalação da DLL não exigem que o programa seja vinculado


novamente à DLL. Além disso, se vários programas usam a mesma DLL, vários programas
serão todos beneficiados com a atualização ou a correção. Esse problema pode ocorrer
com mais frequência quando você usa uma DLL de terceiros que seja atualizada ou fixo
regularmente. Resumindo, como uma DLL é um arquivo, você pode substituir apenas
este arquivo para realizar correções em um programa.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


233
3.1 - CRIANDO O PRIMEIRO EXEMPLO DE CLASS LIBRARY (BIBLIOTECA DE CLASSES)
Imagine que você esteja trabalhando como desenvolvedor de uma empresa de crédito e
precisa implementar todos os cálculos e regras de negócio desta instituição. Considerando
que essas regras são alteradas constantemente e que teremos vários módulos no Software,
você decide implementar DLLs com esses cálculos e regras de negócio.

Então vamos lá! Para criar um projeto, basta acessar o Visual Studio e criar um projeto Class
Library, conforme a Figura 27.

Figura 27: Criando um Projeto Class Library

Fonte: Elaborada pelo autor.

Perceba que ao criar o projeto, é fornecida uma estrutura com uma classe (class1) e outros
arquivos. Neste momento, você deve estar pensando: posso utilizar os conceitos de Programação
Orientada a Objetos? Claro que sim, pois a diferença básica deste tipo de projeto é que, ele
não gera um instalador ou execução, e sim uma DLL com resultado da estrutura que foi criada.

Agora vamos criar neste projeto uma classe com nome CalculoJuro.

Figura 28: Classe de cálculo de Juros

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


234
A Figura 28 representa a classe CalculoJuro com a implementação do cálculo de juro composto,
conforme a linha 14. Este cálculo é representado por: M = C (1+taxa)^quantidade de parcelas.
Agora, para compilar e gerar a DLL, clique com botão direito no projeto e realize um Builder.
Após realizar o Builder, ao acessar a pasta do projeto, Bin do Debug ou Release você pode
visualizar a DLL. Esta DLL pode ser utilizada por outros projetos, inclusive, em algumas situações,
em projetos Windows que não utilizam a tecnologia .NET.

Agora, vamos testar a nossa DLL. Como foi apresentado nas primeiras aulas, ao criar um projeto
no Visual Studio é criado uma Solution. Uma Solution é uma estrutura que pode conter vários
projetos. Então dentro da mesma Solution do Projeto Class Library que acabamos de criar,
vamos adicionar um projeto Windows Forms para testar a DLL. Para criar o projeto clique com
botão direito no nome da Solution em seguida Add e new Project.

Figura 29: Formulário de calcular Juros

Fonte: Elaborada pelo autor.

A Figura 29 representa a estrutura de componentes que foram adicionados para consumir


a DLL. Note que o formulário possui quatro campos para valores e um botão para executar
a ação do cálculo. Agora vamos adicionar a DLL do projeto que foi criado anteriormente.
Para adicionar a DLL, basta acessar o menu Project e o menu Add Reference. Ao entrar nesta
opção é selecionado o item Solution e o projeto com a DLL é disponibilizado, conforme a Figura
30. Vale ressaltar que, a DLL poderia ser adicionada com a localização do arquivo diretamente
onde ele foi criado.

Figura 30: Adicionando o Projeto com a DLL

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


235
Perceba que ao abrir a pasta Reference no Solution Explorer, você pode visualizar a DLL que
foi adicionada no projeto (Figura 31).

Figura 31: DLL no Solution Explorer

Fonte: Elaborada pelo autor.

A seguir, vamos analisar como utilizar a biblioteca no Form1.cs. Ou seja, no arquivo de


eventos do formulário.

Atenção: você poderia realizar basicamente o mesmo exemplo que vamos apresentar em
uma classe.

Figura 32: Código do arquivo Form1.cs

Fonte: Elaborada pelo autor.

A Figura 32 representa o código de cálculo de juros consumindo a DLL que foi criada, com as
seguintes características:

• Na linha 4, foi adicionado o namespace da DLL. Isto é uma das formas de utilizar a

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


236
biblioteca na forma transparente dentro do formulário.

• Na linha 17, é criada uma instância da classe CalcularJuros da biblioteca. Porém, se


a classe e seus métodos fossem estáticos, não seria necessário realizar a instância do
objeto.

• O restante do código, entre as linhas 18 e 21, recebe os valores que foram digitados
nos campos de texto (textbox), invoca o método para calcular os juros e apresenta o
resultado na tela.

Figura 33: Executando o cálculo

Fonte: Elaborada pelo autor.

Fantástico! Agora você sabe o que significa uma DLL e como utilizá-las. Ops! É claro, você
sabe como criá-la!

VAMOS PRATICAR?!
Utilizando mesmo projeto, crie um método para calcular o juro
simples e crie um formulário para testar este cálculo.

saiba mais!
Existem várias bibliotecas prontas que podem ser utilizadas. Por exemplo, existem
bibliotecas criadas para manipulação de imagens, conexão com repositórios de dados
e outras ações. Além disso, as DLLs podem ser free, open source ou proprietárias. Para
conhecer algumas dessas DLLs, clique aqui.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


237
aUTOaVALIAÇÃO
Após essa aula, você é capaz de desenvolver projetos Windows Forms?
É capaz de desenvolver projetos Class Library (DLL)? Consegue adicionar
as DLL em projetos Windows Forms? Caso você consiga responder estas
questões, parabéns! Você atingiu os objetivos específicos da Aula 7! Caso
tenha dificuldades para responder alguma(s) dela(s), aproveite para reler o
conteúdo da Aula, acessar o UNIARAXÁ Virtual e interagir com seus colegas e
com o(a) tutor(a) e esclarecer todas as suas dúvidas. Você não está sozinho
nessa caminhada! Conte conosco!

RECAPITULANDO
Caro(a) Aluno(a), chegamos ao fim da nossa aula. Espero que tenha compreendido o
conteúdo e resolvido os exercícios. Estudamos sobre LINQ e expressões lambda, criação de
projetos Windows Forms e criação de DLLs.

Muito bem! Em nossa próxima Aula, vamos realizar uma revisão geral sobre os conceitos de
programação orientada a objetos por meio de exemplos práticos. Além disso, vamos discutir
sobre serialização e outros exemplos da linguagem C#.

E, ai, preparado(a) para mais uma jornada de conhecimento?

VIDEOAULA
Após a leitura e o estudo do seu livro-texto, chegou o momento de
complementar seu conhecimento. Vá até seu Ambiente Virtual
de Aprendizagem e acesse a Videoaula referente à Aula.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


238
REFERÊNCIAS
MANZANO, José Augusto N. G. Programação de computadores C#. São Paulo: Érica, 2014.

MICROSOFT. Disponível em: <https://docs.microsoft.com/pt-br>. Acesso em 01 de jul. 2019.

SHARP, John; MANIEZ, Dominique. Visual C# 2010. Microsoft Press, 2010. Porto Alegre: Bookman,
2011.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


239
SUMÁRIO

AULA 8
Objetivos Específicos:

• Desenvolver programas com objetos genéricos.


• Praticar exemplos de serialização e deserialização de objetos.
• Desenvolver programas com Lazy e Reflection.
• Realizar uma revisão sobre parte do conteúdo da disciplina.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


240
UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS
2
AULA 8 - REVISANDO
CONTEXTUALIZANDO A APRENDIZAGEM
Prezado(a) Aluno(a), na Aula anterior você estudou sobre LINQ, desenvolveu projetos com
interface gráfica e Class Library para criação de DLL.

Nessa aula, vamos estudar algumas estruturas avançadas da linguagem C# e desenvolver um


projeto de revisão sobre parte do conteúdo que foi abordado na disciplina.

Ao final desta aula, você será capaz de trabalhar com tipos genéricos, serialização e
deserialização de objetos, reflection e outras estruturas da linguagem C#. Você sabe trabalhar
com tipos genéricos? Consegue serializar e deserializar objetos? Nessa aula, você terá as
respostas para essas e outras perguntas.

Boa aula!

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


241
MAPA MENTAL PANORÂMICO
Para contextualizar e ajudá-lo(a) a obter uma visão panorâmica dos conteúdos que você
estudará na Aula 8, bem como entender a inter-relação entre eles, é importante que se atente
para o Mapa Mental, apresentado a seguir:

OUTRAS ESTRUTURAS DA
LINGUAGEM C# E REVISÃO SOBRE
POO

CLASSES GENÉRICAS

TIPOS GENÉRICOS
(CLASSES, INTERFACES E INTERFACES GENÉRICAS
MÉTODOS)

CRIANDO O NOSSO
EXEMPLO

O QUE É UM XML
(EXTENSIBLE MARKUP
LANGUAGE)

O QUE É UM JSON
SERIALIZAÇÃO DE (JAVASCRIPT OBJECT
OBJETOS NOTATION)

CRIANDO UM EXEMPLO
DE SERIALIZAÇÃO E
DESERIALIZAÇÃO DE
OBJETO

UTILIZANDO O LAZY EXEMPLO DE LAZY

REFLECTION (REFLEXÃO) EXEMPLO DE REFLECTION

ENTENDENDO,
RELEMBRANDO ABSTRAINDO E
PROGRAMAÇÃO CONSTRUINDO O
ORIENTADA A OBJETOS MODELO

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


242
1. TIPOS GENÉRICOS (CLASSES, INTERFACES E MÉTODOS)
Você está desenvolvendo um software com várias classes e com vários relacionamentos de
herança. Então, você percebe que está criando várias estruturas idênticas, por exemplo, está
criando métodos específicos para tratar cada tipo de subclasse. Imagine se fosse possível criar
uma classe ou método que possa trabalhar com qualquer tipo de subclasse. Será que isto seria
possível? Sim, você pode utilizar interfaces, classes e métodos genéricos da linguagem C#. Mas
antes de entrar na prática, vamos analisar o que são tipos genéricos.

Tipos Genéricos foram adicionados à versão 2.0 da linguagem C# e o Common Language


Runtime (CLR). Tipos Genéricos apresentam ao .NET Framework o conceito de parâmetros de
tipo, que possibilitam a criação de interfaces, classes e métodos, que adiam a especificação
de um ou mais tipos, até que a classe ou método seja declarado e instanciada pelo código do
cliente. Por exemplo, ao usar um parâmetro de tipo genérico T, você pode escrever uma única
classe que será convertida em tempo de execução ou operações de conversão (MICROSOFT,
2019). As classes e métodos genéricos combinam a capacidade de reutilização, a segurança
de tipos e a eficiência de uma maneira que suas contrapartes não genéricas não conseguem.

DICA DO AUTOR
Se não lembra como funciona o CLR da estrutura .NET, acesse o conteúdo da
nossa Aula 02.

1.1 CLASSES GENÉRICAS


As classes genéricas encapsulam operações que não são específicas de um determinado tipo
de dado. O uso mais comum das classes genéricas é com coleções, como listas vinculadas,
tabelas de hash, pilhas, filas, árvores e assim por diante. As operações como adicionar e remover
itens da coleção são realizadas basicamente da mesma maneira, independentemente do
tipo de dados que estão sendo armazenados. Na maioria dos cenários que exigem classes de
coleção, a abordagem recomendada é utilizar as que são fornecidas na biblioteca de classes
do .NET.

saiba mais!
Para obter mais informações sobre o uso dessas classes, consulte Coleções genéricas no
site da Microsoft. Para acessar, basta clicar aqui.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


243
As regras para parâmetros de tipo e restrições têm várias implicações para o comportamento
de classes genéricas, especialmente em relação à acessibilidade de membro e herança. Para
uma classe genérica Base<T>, o código cliente pode fazer referência à classe, especificando
um argumento de tipo para criar um tipo construído fechado (Base<int>). Como alternativa,
você pode deixar o parâmetro de tipo não especificado para criar um tipo construído aberto
(Base<T>), como ao especificar uma classe base genérica. As classes genéricas podem herdar
de classes base construídas concretas, fechadas ou abertas (MICROSOFT, 2019):

Note que, no exemplo apresentado, a classe ClasseFechada é um tipo genérico que herda de
uma classe Genérica, entretanto, ao definir inserir o termo int, é definido que é uma BaseGenerica
de inteiros. Vale ressaltar que classes não genéricas ou, em outras palavras, classes concretas,
podem herdar de classes base construídas fechadas, mas não de classes construídas abertas
ou de parâmetros de tipo, porque não é possível fornecer o argumento de tipo necessário para
instanciar a classe base em tempo de execução. Por exemplo, não seria possível criar uma
classe que herde da classe ClasseAberta do exemplo anterior (MICROSOFT, 2019).

1.2 INTERFACES GENÉRICAS


Além de utilizar classes genéricas, você pode utilizar Interfaces genéricas, que em algumas
situações, podem ser úteis para definir Interfaces para classes de coleção genérica ou para as
classes genéricas que representam itens na coleção. Para classes genéricas, utilize interfaces
genéricas, como IComparable<T>. (MICROSOFT, 2019).

saiba mais!
Nessa aula, não vamos abordar os detalhes sobre Interface genérica. Mas se deseja
conhecer mais detalhes, clique aqui.

IComparable<T> define um método de comparação generalizado, que implementa


uma classe ou um tipo de valor para criar um método de comparação de tipo específico,

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


244
para ordenar ou classificar suas instâncias (MICROSOFT,2019). Para analisar os detalhes,
clique aqui.

1.3 CRIANDO O NOSSO EXEMPLO


A seguir, temos uma estrutura com algumas classes que não utilizam tipos genéricos. Neste
momento, o objetivo é explicar a diferença em utilizar ou não utilizar os métodos e classes
genéricas. E para facilitar a compreensão, todas as classes foram criadas em um único arquivo.
Você deve estar pensando: posso criar várias classes no mesmo arquivo? Sim, porém em
projetos reais, este tipo de estrutura não é comum e nem recomendada.

Figura 1 - Sem tipo genérico

Fonte: Elaborada pelo autor.

O exemplo da Figura 1 representa uma estrutura com 3 classes: Funcionario (classe pai),
Medico e Engenheiro (classe filhas). Além de uma terceira classe (PesquisarFuncionario), que
terá a responsabilidade de conter os métodos de pesquisa de funcionário. Perceba que a
classe Funcionario possui uma referência para ela mesma na propriedade chefe, isto indica
que um funcionário pode ter um chefe. Neste momento, temos o primeiro problema. Imagine
que na regra o médico possa ser chefiado, apenas por outro médico. Porém, nessa estrutura,
o médico pode ter qualquer chefe que herde de funcionário, ou seja, o médico pode ter um
chefe engenheiro.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


245
Na classe PesquisarFuncionario, criamos um método para cada tipo de funcionário que será
pesquisado, representado pelos métodos RetornarMedico e RetornarEngenheiro. Então, note
que, a cada classe filha que for adicionada, seria necessário adicionar um método específico.

A seguir, vamos criar um exemplo, utilizando métodos e classes genéricas para melhorar
a estrutura do exemplo apresentado. Entretanto, vale ressaltar que podem existir outras
alternativas para melhorar o código. Mas o nosso objetivo neste momento, é comparar as duas
estruturas, com e sem tipos genéricos.

Figura 2 - Utilizando tipo genérico

Fonte: Elaborada pelo autor.

O exemplo da Figura 2, representa a alteração da estrutura do exemplo da Figura 1, com


utilização de métodos e classes genéricas, com as seguintes características:

• Na linha 19, Funcionario<T> define que funcionário é um tipo genérico. Além disso, a parte
do código where T : Funcionario<T> define que todas as classes que herdam da classe
genérica, obrigatoriamente, devem ser do tipo Funcionario.

• Note que a classe Medico, herda de Funcionario<Medico>, isto indica que, todo médico
não pode ser de outro tipo a não ser médico. Isto está relacionado com construtor fechado,
que já discutimos nesta aula. Além disso, a classe Engenheiro segue a mesma estrutura.

• Na linha 11, temos a assinatura do método genérico. Com esta estrutura, o método pode
receber qualquer objeto do tipo genérico Funcionario. A estrutura do Where define que
o tipo de retorno será um objeto genérico do tipo Funcionario. E como parâmetro, ela
recebe um T, que pode ser Medico ou Engenheiro, ou seja, qualquer objeto que herde
Funcionario<T>.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


246
• Note que a estrutura da linha 13, o método Activator “força” a instância de um objeto do
tipo que foi passado, ou seja, Medico ou Engenheiro. Neste momento, o objeto func passar
a se comportar de acordo com seu tipo concreto (Medico ou Engenheiro).

Espero que tenha compreendido as vantagens dos objetos genéricos. Neste exemplo, foi
apresentada uma estrutura básica para que você possa compreender sua aplicação. Para
finalizar, vamos analisar a visão geral de tipos genéricos (MICROSOFT, 2019).

Figura 3 - Visão geral de tipos genéricos

Fonte: MICROSOFT (2019).

saiba mais!
Existem outras estruturas de objetos genéricos. Então, para conhecer outros detalhes,
acesse aqui.

2. SERIALIZAÇÃO DE OBJETOS
Imagine que você tenha uma estrutura em uma classe, ou uma coleção de objetos em uma lista
e precisa armazenar os dados em arquivo binário, JSON ou XML. Por exemplo, para trabalhar
com algum documento obrigatório, como uma NFe (Nota Fiscal Eletrônica) ou atender algum
requisito de integração. Por outro lado, imagine que seja necessário acessar as informações
de um arquivo XML e preencher uma lista de objetos com resultado da pesquisa. Então, qual
seria a solução? Existem algumas opções para atender esses requisitos, entre elas, o processo
de serialização e deserialização de objetos.

A serialização (Figura 4) é o processo de converter um objeto em um fluxo de bytes para

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


247
armazenar o objeto ou transmiti-lo para a memória, um banco de dados ou um arquivo.
Sua principal finalidade é salvar o estado de um objeto para recriá-lo quando necessário. O
processo inverso é chamado deserialização (MICROSOFT, 2019).

Figura 4 - Serialização de Objetos

GLOSSÁRIO
FIREWALL

É um dispositivo ou um
programa que tem por
objetivo aplicar uma política
de segurança em uma rede
Fonte: MICROSOFT (2019). de computadores.

W3C
O objeto é serializado em um fluxo que transporta não apenas
O World Wide Web
os dados, mas informações sobre o tipo de objeto, como sua
Consortium é a principal
versão, cultura e nome do assembly. Esse resultado pode
organização de
ser armazenado em um banco de dados, um arquivo ou
padronização da World
uma memória. A serialização permite que o desenvolvedor
Wide Web. Consiste em
salve o estado de um objeto e recrie conforme necessário,
um consórcio internacional
fornecendo o armazenamento dos objetos, bem como a
com quase 400 membros,
troca de dados. Pela serialização, um desenvolvedor pode
agrega empresas,
executar ações como enviar o objeto para um aplicativo
órgãos governamentais
remoto por meio de um serviço Web, passando um objeto
e organizações
de um domínio para outro, passando um objeto por um
independentes com a
firewall como uma cadeia de caracteres XML ou JSON, ou
finalidade de estabelecer
mantendo a segurança ou as informações específicas de
padrões para a criação e a
usuários entre aplicativos (MICROSOFT, 2019).
interpretação de conteúdos
Antes de criar os nossos exemplos, vamos descobrir o que para a Web.
significa XML e JSON, estruturas que podem ser criadas na
serialização.

2.1 O QUE É UM XML (EXTENSIBLE MARKUP LANGUAGE)


O XML (linguagem de marcação extensível), surgiu em 1996 e, em 1998, tornou-se uma
recomendação da W3C. Sua estrutura foi criada para descrever dados e dando semântica à
unidade de informação. Utilizada para trocar dados na internet ou qualquer meio eletrônico,

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


248
principalmente para trocar dados entre tecnologias e softwares diferentes. Pode de utilizado
para organizar documentos e como metadados de uma aplicação. Temos, a seguir (Figura 5),
um exemplo de um arquivo XML e como ele pode ser representado em uma tabela.

Figura 5 – Exemplo de XML

Exemplo de XML
<cadastro>
<cliente>
<nome>José Objetos</nome>
<email>jose@objetos.com.br</email>
</cliente>
<cliente>
<nome>Maria Objetos</nome>
<email>maria@objetos.com.br</nome>
</cliente>
</cadastro>
Fonte: Elaborada pelo autor.

Existem várias configurações em um XML, por exemplo, a utilização de atributos, validações e


esquemas. Entretanto apresentamos apenas um resumo da sua estrutura. Além disso, note no
exemplo que, cada elemento é separado por TAGs, por exemplo, o nome está entre as tags
<nome></nome>.

saiba mais!
Nosso objetivo não é explicar todos os detalhes sobre XML. Se quiser conhecer mais
detalhes sobre XML acesse o site da W3C. Basta clicar aqui. Ou assista a esse vídeo aqui.

2.2 O QUE É UM JSON (JAVASCRIPT OBJECT NOTATION)


JSON (Notação de Objeto JavaScript), foi criada por Douglas Crockford em meados de 2000.
Sua estrutura é baseada em um padrão aberto para troca de dados simples. Atualmente, essa
estrutura é utilizada para troca de informações entre aplicações. Além disso, é considerada
uma estrutura que pode substituir o XML, pois é de fácil compreensão e pode ser utilizada em
várias linguagens de programação, inclusive nas linguagens Orientadas a Objetos. O exemplo
a seguir, representa a estrutura XML e a mesma estrutura utilizando JSON.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


249
Figura 6 - Exemplo de XML e JSON

Exemplo de XML e JSON


<cadastro>
<cliente>
<nome>José Objetos</nome>
<email>jose@objetos.com.br</email>
</cliente>
<cliente>
<nome>Maria Objetos</nome>
<email>maria@objetos.com.br</email>
</cliente>
</cadastro>
Fonte: Elaborada pelo autor.

Note que JSON possui uma estrutura mais próxima de uma linguagem de programação
procedimental, além de ser mais fácil de compreender.

A seguir, vamos criar alguns exemplos de serialização e deserialização de objetos.

saiba mais!
Nosso objetivo não é explicar todos os detalhes do JSON. Então, se quiser conhecer os
detalhes sobre este tipo de arquivo, clique aqui.

2.3 CRIANDO UM EXEMPLO DE SERIALIZAÇÃO E DESERIALIZAÇÃO DE OBJETO


Neste exemplo, vamos aprender a serializar e deserializar arquivos XML, Binário e JSON. Vamos
criar um projeto Windows Forms conforme a Figura 7.

Figura 7 - Formulário de serialização

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


250
Como deve ter percebido, foram adicionados seis botões que representam a serialização e
deserialização, além de um DataGridView para apresentar o resultado da deserialização.

Figura 8 - Classe Cliente

Fonte: Elaborada pelo autor.

A Figura 8, representa a classe (Cliente) de objetos que será serializada. Note que foi adicionado
o termo [Serializable], que informa que a classe pode ser serializável. Entretanto, em alguns
casos isto não é necessário. Por outro lado, se quiser bloquear a classe para que não seja
serializável, basta adicionar [NonSerialized].

A seguir, vamos analisar a estrutura de serialização e deserialização que foi desenvolvida na


estrutura do Form1.cs com utilização de eventos, ou seja, dentro da codificação do formulário
da Figura 7. Para ficar mais fácil a compreensão, o conteúdo será apresentado por partes.

Figura 9 - Criando lista e adicionando objetos

Fonte: Elaborada pelo autor.

A Figura 9, representa a estrutura inicial do arquivo Form1.cs, com a seguinte estrutura:

• Na linha 19, foi criada uma lista de objetos do tipo Cliente.

• Entre as linhas 21 e 26, está a estrutura do método CriarLista, responsável por adicionar
cinco clientes na lista.

• A linha 30, contém o contexto do método construtor do formulário. Dentro deste contexto,
a lista é criada ao invocar o método CriarLista.

Agora vamos analisar como é desenvolvida a serialização e deserialização dos objetos da lista
para um arquivo binário.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


251
Figura 10 - Serialização e deserialização utilizando arquivo binário

Fonte: Elaborada pelo autor.

A Figura 10 representa o exemplo de serialização dos objetos da lista de Cliente para um arquivo
binário, com os seguintes detalhes:

• Entre as linhas 33 e 38, está o contexto do evento do clique no botão btnSeriazaBin

• Note que, na linha 35, é utilizado o FileStream para criar um arquivo binário em uma
determinada pasta.

• Na linha 36, é criado um objeto do tipo que será responsável em serializar os objetos.

• Em seguida, na linha 37, é realizada a serialização. Ao executar o programa e acessar a


pasta é possível abrir o arquivo e analisar o conteúdo que foi serializado, conforme a Figura
11. Note que é difícil compreender o conteúdo, pois trata-se de um arquivo binário.

Figura 11 - Arquivo Binário

Fonte: Elaborada pelo autor.

Note que na Figura 10, temos a estrutura de deserialização presente no evento do clique do
botão, btnDeserializarBin:

• Na linha 41, é utilizada a opção do fileStream para leitura de arquivos.

• Na linha 42, utilizamos o mesmo objeto que foi utilizado na serialização.

• Na linha 43, está a estrutura responsável em deserializar o objeto e armazenar em uma lista
com nome pesquisa. Em seguida, os valores são preenchidos no DataGridView (chamado
de griddados), conforme Figura 12. Os dados foram preenchidos, ao clicar no botão
Deserializar Binário.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


252
Figura 12 - Deserialização do arquivo binário

Fonte: Elaborada pelo autor.

Agora vamos analisar como é realizada a serialização e deserialização em arquivos XML.


Basicamente, utilizamos a mesma estrutura utilizada em arquivos binários.

Figura 13 - Serialização e deserialização utilizando arquivo XML

Fonte: Elaborada pelo autor.

A Figura 13, representa a estrutura de serialização e deserialização utilizando arquivo XML. Note
que a estrutura é idêntica ao manipular arquivo binário, a diferença básica está no tipo de
objeto que foi utilizado para serializar e deserializar, que pertence ao namespace System.Xml.
Serialization. Veja na Figura 14, o resultado da estrutura do arquivo ao serializar. Além disso, o
resultado ao clicar no botão Deserializar XML, será o mesmo apresentado na Figura 12.

Figura 14 - Arquivo XML com resultado da serialização

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


253
Agora, vamos conhecer a estrutura de serialização e deserialização utilizando arquivos Json.
Diferente dos exemplos anteriores, nesta estrutura, precisamos instalar os pacotes Json.NET, por
meio do NuGet.

saiba mais!
Acesse o link para descobrir o que significa e como utilizar o NuGet do Visual Studio.
Basta clicar aqui.

Figura 15 - Serializando e deserializando arquivos Json

Fonte: Elaborada pelo autor.

A Figura 15, representa a estrutura de serialização e deserialização de arquivos Json. Este


exemplo possui uma similaridade com os exemplos anteriores. Entretanto, utilizamos o using
para auxiliar na liberação dos recursos. A Figura 16, representa o resultado da serialização. E
ao deserializar o arquivo, os dados são apresentados, conforme a Figura 12.

Figura 16 - Arquivo Json serializado

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


254
CONECTANDO

A partir de agora, você sabe serializar e deserializar objetos utilizando a linguagem


C#. Além disso, você conheceu a estrutura básica de arquivos XML e Json, que são
frequentemente utilizados em produtos de software. Entretanto, fique tranquilo(a), pois
em outras disciplinas você terá um contato mais detalhado com XML, e principalmente
sobre Json.

3. UTILIZANDO O LAZY
Quando em uma classe A é criada uma instância de uma classe B, todos os objetos da classe
B que estão como atributos, propriedades e métodos são criados na memória. Entretanto,
imagine que ao instanciar a classe A, você não deseja utilizar os objetos complexos, por
exemplo, uma lista de elementos de uma classe C ou uma instância da classe D. Será que seria
possível resolver este problema? Sim, com a utilização da estrutura Lazy.

Lazy de um objeto significa que a criação dele é adiada até que ele seja usado pela primeira
vez (Para este tópico, os termos inicialização lenta e instanciação lenta são sinônimos.)
A inicialização lenta (Lazy) é usada principalmente para melhorar o desempenho, evitar a
computação dispendiosa e reduzir os requisitos de memória do programa. Estes são os cenários
mais comuns (MICROSOFT, 2019). Um bom exemplo é quando você tem um objeto de criação
dispendiosa e o programa pode não vir a usá-lo durante sua execução. Por exemplo: você tem,
na memória primária, um objeto Cliente que possui uma propriedade Pedidos contendo uma
grande variedade de objetos Pedidos que, ao serem inicializados, requerem uma conexão de
banco de dados. Se o usuário nunca solicita a exibição dos Pedidos nem usa os dados em uma
computação, não há motivo para usar a memória do sistema ou ciclos de computação para
criá-lo. Ao usar Lazy<Pedidos> para declarar o objeto Pedidos para inicialização lenta, você
pode evitar desperdício de recursos de sistema quando o objeto não é usado (MICROSOFT,
2019).

! FIQUE ATENTO!

Memória Primária é formada pelos registradores, pela memória


cache e pela memória RAM. Em especial, a citação nessa aula

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


255
sobre memória principal, está relacionada com a memória
RAM. Vale ressaltar que os dados armazenados na memória
RAM são eliminados quando o dispositivo é reiniciado ou
desligado.

Quando você tem um objeto cuja criação é dispendiosa e você deseja adiar a criação até
após a conclusão de outras operações dispendiosas. Por exemplo, suponha que seu programa
carrega várias instâncias de objeto quando ele é iniciado, mas apenas algumas delas são
necessárias imediatamente. Você pode melhorar o desempenho de inicialização do programa,
adiando a inicialização dos objetos que não são necessários, até que os objetos necessários
tenham sido criados.

3.1 EXEMPLO DE LAZY


Você está desenvolvendo uma estrutura com uma classe Conta e outra Cliente. E na estrutura
da classe Conta, existe uma instância da classe Cliente. Entretanto, você deseja acessar apenas
as propriedades da Conta, deixando de fora o objeto complexo que representa um Cliente. É
neste tipo de cenário que o Lazy pode ser utilizado. A seguir, vamos analisar um exemplo.

Figura 17 - Classe Conta

Fonte: Elaborada pelo autor.

Note que a Figura 17, contém a estrutura de uma classe Conta. Foram criadas algumas
propriedades e um método construtor. Entretanto, note que na criação do tipo Cliente, foi
utilizado o Lazy. E ao instanciar o objeto na linha 16 do método construtor, foi inferido que o
objeto clienteconta é um tipo Cliente, porém utilizando Lazy.

Agora, vamos analisar como seria utilização da classe Conta. A seguir, temos o exemplo
utilizando a classe Program em um projeto Console Application.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


256
Figura 18 - Testando o Lazy

Fonte: Elaborada pelo autor.

A Figura 18, representa o exemplo de utilização do Lazy, com a seguinte estrutura:

• Entre as linhas 14 e 16, foi criada uma instância da classe Conta e adicionados os valores
para as propriedades.

• Na linha 17, os valores das propriedades são apresentados na tela.

• Na linha 18, é apresentado na tela se o objeto clienteconta que pertence ao tipo Cliente
foi instanciado. Note que o valor apresentado na tela é igual a False, ou seja, o objeto não
foi instanciado. Pois, lembra que definimos o Cliente como Lazy? Então, para acessar os
objetos complexos instanciados com a estrutura Lazy é necessário utilizar o termo Value.

• Na linha 19, foi apresentada a propriedade do nome do Cliente. Note que foi necessário
utilizar o Value antes do nome da propriedade. Então, a partir dessa execução o objeto
clienteconta foi instanciado. Note que na linha seguinte (20), ao analisar se existe uma
instância, é retornado o valor True.

Resumindo, o objetivo complexo somente foi instanciado a partir da linha 19, quando foi
necessário, mostrar o nome do cliente na tela. Isto parece mágica, não é verdade!?!?

saiba mais!
A partir de agora, você sabe como economizar memória ao utilizar o Lazy. Além disso,
existem outras aplicações do Lazy que podem ser consultadas clicando aqui.

4. REFLECTION (REFLEXÃO)
Em algumas situações, talvez seja interessante, desenvolver métodos que possam trabalhar
com vários tipos de objetos. Agora você deve estar pensando: já discutimos algo relacionado
a este item nos tipos genéricos? Sim, verdade, mas em algumas situações a necessidade pode

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


257
ser a criação de métodos para manipular qualquer tipo de objeto, então, uma opção seria a
utilização do reflection.

O reflection (reflexão) fornece objetos (do tipo Type) que descrevem assemblies, módulos e
tipos. É possível usar a reflexão para criar dinamicamente uma instância de um tipo, associar
o tipo a um objeto existente ou obter o tipo de um objeto existente e invocar seus métodos
ou acessar suas propriedades e campos. Se você estiver usando atributos em seu código,
a reflexão permite acessá-los. A seguir, vamos analisar um exemplo prático da utilização do
reflection.

4.1 EXEMPLO DE REFLECTION


Para facilitar, vamos criar dois exemplos, um sem utilização do reflection, e o segundo utilizando
reflection.

No exemplo a seguir, temos uma estrutura com três classes, onde as classes Livro e Revista
representam os objetos que podem ser acessados em um programa de leitura, e a classe
RegistrarLog, que possui a responsabilidade de salvar o log de acesso em cada tipo.

Figura 19 - Sem Reflection

Fonte: Elaborada pelo autor.

Note que o exemplo da Figura 19, possui as seguintes características:

• Entre as linhas 24 e 34, estão a estrutura das classes Livro e Revista, com suas propriedades.

• Note que nas linhas 12 e 13, foram instanciados os objetos das classes Livro e Revista. Vale
ressaltar que esta estrutura foi criada apenas para teste, sem uma funcionalidade real.

• Entre as linhas 15 e 21, está a estrutura do método responsável em salvar o log do Livro.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


258
Neste momento percebemos que seria necessário criar outro método para Revista. Além
disso, se fosse criada uma classe Artigo, seria necessário criar outro método. Então, por que
não apenas um método?

O exemplo a seguir representa a alteração do exemplo anterior, com a utilização do Reflection.

Figura 20 - Com Reflection

Fonte: Elaborada pelo autor.

A Figura 20, possui uma estrutura idêntica ao exemplo da Figura 19. Entretanto note que o
método de registrar o log foi alterado. Inicialmente seu nome foi alterado para Registrar. O
parâmetro que ele recebe é do tipo object, que significa que pode receber qualquer tipo de
objeto. Note que na linha 17, foi criado um tipo que recebe o tipo do objeto por meio do obj.
Getype(). Então, neste momento o tipo pode ser um Livro ou Revista. Entre as linhas 21 e 24, é
realizado um foreach para armazenar o nome da propriedade do tipo e o valor. Note que, as
classes podem ter quantidade de propriedades diferentes, então, perceba que esta estrutura
pode controlar qualquer objeto.

saiba mais!
Conheça o Mono.cecil que é uma implementação de código aberto do Framework .NET
Framework da Microsoft baseado nos padrões ECMA para o C# e a Common Language
Runtime. Basta clicar aqui.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


259
Fantástico! Não é verdade? O método Registrar pode receber qualquer tipo de objeto, seja
uma Revista, Livro ou qualquer outro tipo.

5. RELEMBRANDO PROGRAMAÇÃO ORIENTADA A OBJETOS


Para finalizarmos com sucesso, vamos revisar os principais conceitos de Programação Orientada
a Objetos, com exemplos práticos e teóricos. O objetivo é revisar todo o conteúdo e garantir que
você tenha compreendido o fantástico mundo da Programação Orientada a Objetos. Além
disso, sabe aquele conceito e aplicação prática de POO que você ainda não compreendeu?
Agora chegou a hora de revisar e compreender.

Então, vamos desenvolver um exemplo, onde serão apresentadas apenas as classes com a
maioria dos itens relacionados à Programação Orientada Objetos.

5.1 ENTENDENDO, ABSTRAINDO E CONSTRUINDO O MODELO


Abstração pode ser considerada a parte mais complexa da programação orientada a objetos,
pois nessa fase, é realizada a transformação do mundo real no mundo computacional. E
geralmente, a modelagem é realizada com auxílio do diagrama de classe (UML). Porém,
antes de modelar você precisa aprender a pensar como objeto. Lembra com pensar como
objetos? Vamos relembrar. Objetos podem ser categorizados e uma classe que descreve, de
uma maneira abstrata, todos os objetos de um tipo em particular.

DICA DO AUTOR
Se ainda tiver dúvidas sobre objetos e classes, volte ao conteúdo da Aula 1.

Vamos praticar o nosso poder de abstração?

Imagine que uma empresa de aluguel de temas para festa infantil te contrate para desenvolver
um controle de locações. Vale ressaltar que, como é apenas um modelo didático, vamos
delimitar o escopo do programa para compreendermos sua estrutura.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


260
Quadro 1: Escopo do programa

Minimundo: Temas Infantis


A Empresa Rafaela possui vários temas de festas infantis para aluguel. Ela precisa controlar os
aluguéis e para isso, precisa de uma aplicação que permita cadastrar: o nome e telefone do
cliente, o endereço completo da festa o tema escolhido, a data da festa, a hora de início e
término da festa.
Além disso, para alguns clientes antigos, a empresa oferece descontos. Sendo assim, é
preciso saber o valor realmente cobrado num determinado aluguel.
Para cada tema, é preciso controlar: a lista de itens que compõe o tema (ex: castelo, boneca,
bruxa, etc), o valor do aluguel e a cor da toalha da mesa que deve ser usada com o tema.
A empresa costuma realizar aluguel para clientes pessoa jurídica, onde é necessário
armazenar o CNPJ, e pessoa física onde é necessário armazenar o CPF.
Fonte: Adaptada de MELO (2006).

A seguir, vamos identificar as classes e os possíveis atributos que serão implementados como
propriedades. Entretanto, seria interessante que você tentasse descobrir as classes antes de
continuar a leitura.

Dentro da área de análise de sistema, existem alguns métodos para realizar a identificação das
classes e seus atributos, entretanto este assunto não será abordado neste momento. Contudo,
vamos utilizar nossa percepção do minimundo que foi relatado, para identificar as classes.
Note que existem algumas palavras que podem nos ajudar a identificar. Inicialmente, pense
em procurar os substantivos, pois eles são fortes candidatos a se tornarem classes.

A seguir, são apresentadas as classes que foram encontradas no minimundo:

• Aluguel: note que aluguel possui algumas características que precisam ser controladas,
pense, como saber quantos aluguéis a empresa realizou? Como saber o valor que foi
faturado no mês? Além disso, note que uma festa possui algumas propriedades, como
data, hora de início e fim da festa e valor cobrado.

• Tema: note que para realizar um aluguel é necessário escolher um tema. E este tema possui
características, como nome, valor do aluguel, pois o aluguel da Cinderela pode ser mais
caro do que o aluguel dos Avengers. Além disso, note que durante o texto é descrito sobre
a necessidade de salvar o nome da cor da toalha que será utilizada com o tema.

• Itens: note que para cada tema existem alguns itens que o compõe. Este item pode possuir
nome e descrição. Além disso, a classe tema terá uma composição de itens. Pois não existe
um tema que não tenha pelo menos um item, não é verdade?

• Endereco: note que durante a descrição do minimundo, foi enfatizado a necessidade de


armazenar o endereço da festa, ou seja, do aluguel. Muitos poderiam colocar os dados
endereço na classe Aluguel, entretanto neste momento comece a pensar que Endereco

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


261
possui informações próprias.

• Cliente: note que no texto foi descrito que existem clientes, então existe a necessidade da
criação dessa classe. Além disso, foi citado a necessidade de controlar clientes por tipo
jurídico ou físico. Então, teremos duas subclasses: Fisico e Juridico.

A seguir, é apresentado o diagrama com algumas classes, métodos e propriedades.

Figura 21 - Diagrama de Classe - Projeto Final

Fonte: Adaptada de MELO (2006).

A Figura 21, representa o diagrama de classe do projeto. Perceba que todas as classes foram
criadas. Além disso, criamos uma classe Desconto para simularmos a utilização de métodos
estáticos. A seguir vamos criar um projeto com a estrutura das classes e detalhar cada parte
do código.

Neste momento, sugiro que tente criar o programa em um projeto Windows Forms ou Console
Application. Isto é indispensável para você colocar em prática o que aprendeu.

Então, vamos lá! A partir de agora, vamos apresentar toda a estrutura das classes do diagrama
(Figura 21) e explicar os detalhes e analisar os conceitos de Programação Orientada a Objetos
que foram utilizados.

Figura 22 - Classe ItemTema

Fonte: Elaborada pelo autor.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


262
A Figura 22, representa a classe ItemTema. Perceba que utilizamos atributos de classe e não
propriedades. Além disso, o seu tipo de visibilidade é público (public), ou seja, qualquer classe
externa terá acesso.

Figura 23 - Classe Tema

Fonte: Elaborada pelo autor.

A Figura 23, representa a estrutura da casse tema. Como foi definido no diagrama de classe
(Figura 21), existe uma relação de composição entre a classe Tema e ItemTema, pois um tema
deve ser composto por um ou mais itens, além disso, o tema não existe sem que tenha pelo
menos um item. Na prática, é possível afirmar que na classe Tema teremos uma lista de itens.

Vamos analisar mais alguns detalhes:

• Nas linhas 11, 12 e 13, foram criadas três propriedades, lembre-se que esta é uma das formas
da linguagem C# encapsular atributos de classe. Mas lembra o que é Encapsulamento?
Encapsulamento pode auxiliar na segurança, pois é possível “esconder” métodos e atributos
de uma classe para que não sejam acessados por classes externas. Isto pode auxiliar na
segurança e integridade dos produtos de software. Note que as propriedades podem ser
lidas (get) por classes externas, porém não podem ser acessadas, pois o set está definido
como privado (private).

• Na linha 16, foi declarado a assinatura do método Salvar. Lembra o que significa a assinatura
de um método? A assinatura do método é definida pela sua estrutura relacionada com os
seguintes itens: nome do método, número de parâmetros, os modificadores dos parâmetros
e os tipos dos parâmetros.

• Entre as linhas 20 e 23, temos a estrutura responsável em adicionar objetos do tipo ItemTema
na lista de itens. Neste momento, utilizamos uma lista genérica de elementos List<T>.

A seguir, vamos analisar as classes Cliente, Fisico e Juridico. Mas antes volte no diagrama de
classe (Figura 21) e veja como essas classes estão inseridas no contexto do diagrama.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


263
Figura 24 - Classe Tema

Fonte: Elaborada pelo autor

O exemplo da Figura 24, representa a classe Cliente. Note que utilizamos alguns conceitos
de programação orientada a objetos. Inicialmente a classe foi declarada como abstrata
(abstract), ou seja, ela não pode ser instanciada por outras classes. E isto seria realmente
necessário neste exemplo, imagine, como temos duas classes Fisico e Juridico que herdam da
classe Cliente, naturalmente durante o desenvolvimento do programa, nunca será necessário
instanciar uma classe Cliente. Neste mesmo exemplo, como a classe é abstrata, seus métodos
obrigatoriamente devem ser abstratos e não podem possuir implementação. A seguir, vamos
analisar as classes Fisico e Juridico que herdam da classe Cliente.

Figura 25 - Classes Fisico e Juridico

Fonte: Elaborada pelo autor.

A Figura 25, representa a classe Fisico e Juridico. Antes de entrar nos detalhes do código, pense:
Um cliente jurídico (empresa) possui características distintas de um cliente físico (você), então,
seria interessante ter essas informações separadas, entretanto, os dois tipos também possuem
características idênticas, que no nosso exemplo foi adicionado na classe Cliente (superclasse).
Alguns detalhes sobre o exemplo da Figura 25 podem ser detalhados em:

• Na linha 9, duas classes (Fisico e Juridico) foram declaradas e definido um relacionamento


de herança com classe Cliente. Então a partir da declaração de herança, as classes Fisico
e Juridico precisam da classe Cliente para existir.

• Note que nas duas classes, o método Salvar foi sobrescrito (override). Neste momento
estamos atendendo uma obrigação, pois quando uma classe herda de outra classe, e
a classe herdada (superclasse) possui métodos abstratos, é obrigatório que a classe
filha sobrescreva esses métodos. Note no exemplo da Figura 24, que o método Salvar foi
declarado como abstrato na classe Cliente. Além disso, nesse método aplicamos outro

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


264
conceito, o polimorfismo que é possibilidade de métodos herdados serem implementados
de formas distintas pelas classes filhas (subclasses). Isto é notório, pois a estrutura do método
Salvar, será diferente entre as classes Fisico e Juridico. Vale ressaltar que as classes poderiam
ter métodos próprios que não foram herdados da classe Cliente.

A seguir, vamos analisar as classes Endereco e Aluguel. Mas antes, volte no diagrama de classe
(Figura 21) e análise como essas classes estão inseridas no contexto do diagrama.

Figura 26 - Classe Endereco

Fonte: Elaborada pelo autor.

A Figura 26, representa a classe Endereco, com suas propriedades. Todas as propriedades
podem ser lidas (get) e alteradas (set) por classe externas.

Figura 27 - Classe Festa

Fonte: Elaborada pelo autor.

A Figura 27, representa a estrutura da classe Aluguel. Note que foram criadas 5 propriedades.
Vale destacar que a propriedade endereco (linha 15), será utilizada para instanciar um objeto
do tipo Endereco, como o relacionamento é de um para um, ou seja, um aluguel possui um
endereço, e um endereço pertence a um aluguel, esta seria uma das formas de realizar este
relacionamento.

Vamos descrever sobre a última classe. Mas antes gostaria de saber: você lembra o que é
método estático? Métodos estáticos não requerem uma instância da classe e não podem
acessar de forma implícita os dados. Na linguagem C#, o método estático é definido com o

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


265
termo static no início da declaração. Além disso, na Programação Orientada a Objetos, um
método estático é considerado um método da classe e não do objeto.

Figura 28 - Classe Desconto

Fonte: Elaborada pelo autor.

A Figura 28, representa a classe Desconto que possui dois métodos estáticos. Note que os
métodos são públicos (publics) e possuem o identificador de estáticos (static). Além disso, a
classe também é estática. Então, em qualquer parte do programa, os métodos dessa classe
podem ser utilizados, sem a necessidade de instanciar um objeto (New). Neste exemplo, os
métodos possuem o um retorno do tipo Decimal. E para finalizar, veja que aplicamos o conceito
de sobrecarga de métodos, pois os métodos possuem o mesmo nome, porém com assinaturas
diferentes.

Fantástico! No exemplo apresentado, realizamos uma revisão sobre os principais conceitos da


programação orientada a objetos. Trabalhamos a abstração para transformar o minimundo em
uma estrutura computacional. Discutimos sobre encapsulamento, quando utilizamos os termos
public, protected e private nas propriedades, lembrando que este conceito pode ser utilizado
nos métodos. Herança e polimorfismo quando trabalhamos com as classes Cliente, Fisico e
Juridico. Além disso, neste exemplo de herança aplicamos o conceito de classe abstrata.
Utilizamos lista de objetos para representar a composição. Por fim, criamos uma classe estática
Desconto que possui dois métodos estáticos e com sobrecarga.

VAMOS PRATICAR?!
Exercício - Com base na estrutura apresentada na revisão, simule
algumas locações, com auxílio de lista e telas windows forms ou
com Console Application. Fique à vontade para aplicar a sua
criatividade, pois neste momento você deve estar preparado(a)
para construir projetos de software orientado a objetos.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


266
aUTOaVALIAÇÃO
Após essa aula, você é capaz de utilizar métodos e classes genéricas? É
capaz de desenvolver projetos utilizando Lazy e Reflection? Consegue
serializar e deserializar objetos? Conseguiu revisar os conceitos de
Programação Orientada a Objetos? Caso você consiga responder estas
questões, parabéns! Você atingiu os objetivos específicos da Aula 8! Caso
tenha dificuldades para responder alguma(s) dela(s), aproveite para reler o
conteúdo da Aula, acessar o UNIARAXÁ Virtual e interagir com seus colegas e
com o(a) tutor(a) e esclarecer todas as suas dúvidas. Você não está sozinho
nessa caminhada! Conte conosco!

RECAPITULANDO
Caro(a) Aluno(a), chegamos ao fim da nossa aula. Espero que tenha compreendido o conteúdo
e resolvido os exercícios. Estudamos sobre Reflection, Lazy, Classes e Métodos Genéricos.
Trabalhamos com serialização e deserialização de objetos. Além disso, realizamos uma revisão
sobre os conceitos e práticas de programação orientada a objetos.

VIDEOAULA
Após a leitura e o estudo do seu livro-texto, chegou o momento de
complementar seu conhecimento. Vá até seu Ambiente Virtual
de Aprendizagem e acesse a Videoaula referente à Aula.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


267
REFERÊNCIAS
BOOCK, Grandy; RUMBAUGH, James; JACOBSON, Ivar. UML guia do usuário: o mais avançado
tutorial sobre Unified Modeling Language (UML). 2. ed. Rio de Janeiro: Campus, 2006.

MANZANO, José Augusto N. G. Programação de computadores C#. São Paulo: Érica, 2014.

MELO, Ana Cristina. Exercitando modelagem em UML. Rio de Janeiro: Brasport, 2006.

MICROSOFT. Disponível em: <https://docs.microsoft.com/pt-br>. Acesso em 01 de jul. 2019.

SHARP, John; MANIEZ, Dominique. Visual C# 2010. Microsoft Press, 2010. Porto Alegre: Bookman,
2011.

UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS


268
UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS
269
UNIARAXÁ - CENTRO UNIVERSITÁRIO DO PLANALTO DE ARAXÁ • TODOS OS DIREITOS RESERVADOS
2

Você também pode gostar