Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO PROGRAMAÇÃO ORIENTADA A OBJETOS I 2 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO A Faculdade Multivix está presente de norte a sul do Estado do Espírito Santo, com unidades em Cachoeiro de Itapemirim, Cariacica, Castelo, Nova Venécia, São Mateus, Serra, Vila Velha e Vitória. Desde 1999 atua no mercado capixaba, des- tacando-se pela oferta de cursos de gradua- ção, técnico, pós-graduação e extensão, com qualidade nas quatro áreas do conhecimen- to: Agrárias, Exatas, Humanas e Saúde, sem- pre primando pela qualidade de seu ensino e pela formação de profissionais com cons- ciência cidadã para o mercado de trabalho. Atualmente, a Multivix está entre o seleto grupo de Instituições de Ensino Superior que possuem conceito de excelência junto ao Ministério da Educação (MEC). Das 2109 institui- ções avaliadas no Brasil, apenas 15% conquistaram notas 4 e 5, que são consideradas conceitos de excelência em ensino. Estes resultados acadêmicos colocam todas as unidades da Multivix entre as melhores do Estado do Espírito Santo e entre as 50 melhores do país. MISSÃO Formar profissionais com consciência cida- dã para o mercado de trabalho, com ele- vado padrão de qualidade, sempre mantendo a credibilidade, segurança e modernidade, visando à satisfação dos clientes e colaboradores. VISÃO Ser uma Instituição de Ensino Superior reconheci- da nacionalmente como referência em qualidade educacional. GRUPO MULTIVIX 3 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO BIBLIOTECA MULTIVIX (Dados de publicação na fonte) As imagens e ilustrações utilizadas nesta apostila foram obtidas no site: http://br.freepik.com Castro, Daniel Araujo de. Programação Orientada à Objetos I / Daniel Araujo de Castro. – Serra: Multivix, 2018. EDITORIAL Catalogação: Biblioteca Central Anisio Teixeira – Multivix Serra 2018 • Proibida a reprodução total ou parcial. Os infratores serão processados na forma da lei. FACULDADE CAPIXABA DA SERRA • MULTIVIX Diretor Executivo Tadeu Antônio de Oliveira Penina Diretora Acadêmica Eliene Maria Gava Ferrão Penina Diretor Administrativo Financeiro Fernando Bom Costalonga Diretor Geral Helber Barcellos da Costa Diretor da Educação a Distância Pedro Cunha Conselho Editorial Eliene Maria Gava Ferrão Penina (presidente do Conselho Editorial) Kessya Penitente Fabiano Costalonga Carina Sabadim Veloso Patrícia de Oliveira Penina Roberta Caldas Simões Revisão de Língua Portuguesa Leandro Siqueira Lima Revisão Técnica Alexandra Oliveira Alessandro Ventorin Graziela Vieira Carneiro Design Editorial e Controle de Produção de Conteúdo Carina Sabadim Veloso Maico Pagani Roncatto Ednilson José Roncatto Aline Ximenes Fragoso Genivaldo Félix Soares Multivix Educação a Distância Gestão Acadêmica - Coord. Didático Pedagógico Gestão Acadêmica - Coord. Didático Semipresencial Gestão de Materiais Pedagógicos e Metodologia Direção EaD Coordenação Acadêmica EaD 4 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Aluno (a) Multivix, Estamos muito felizes por você agora fazer parte do maior grupo educacional de Ensino Superior do Espírito Santo e principalmente por ter escolhido a Multivix para fazer parte da sua trajetória profissional. A Faculdade Multivix possui unidades em Cachoei- ro de Itapemirim, Cariacica, Castelo, Nova Venécia, São Mateus, Serra, Vila Velha e Vitória. Desde 1999, no mercado capixaba, destaca-se pela oferta de cursos de graduação, pós-graduação e extensão de qualidade nas quatro áreas do conhecimento: Agrárias, Exatas, Humanas e Saúde, tanto na mo- dalidade presencial quanto a distância. Além da qualidade de ensino já comprova- da pelo MEC, que coloca todas as unidades do Grupo Multivix como parte do seleto grupo das Instituições de Ensino Superior de excelência no Brasil, contando com sete unidades do Grupo en- tre as 100 melhores do País, a Multivix preocupa- -se bastante com o contexto da realidade local e com o desenvolvimento do país. E para isso, pro- cura fazer a sua parte, investindo em projetos so- ciais, ambientais e na promoção de oportunida- des para os que sonham em fazer uma faculdade de qualidade mas que precisam superar alguns obstáculos. Buscamos a cada dia cumprir nossa missão que é: “Formar profissionais com consciência cidadã para o mercado de trabalho, com elevado padrão de quali- dade, sempre mantendo a credibilidade, segurança e modernidade, visando à satisfação dos clientes e colaboradores.” Entendemos que a educação de qualidade sempre foi a melhor resposta para um país crescer. Para a Multivix, educar é mais que ensinar. É transformar o mundo à sua volta. Seja bem-vindo! APRESENTAÇÃO DA DIREÇÃO EXECUTIVA Prof. Tadeu Antônio de Oliveira Penina Diretor Executivo do Grupo Multivix 5 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO APRESENTAÇÃO DA DISCIPLINA Caro aluno, seja bem-vindo à disciplina Programação Orientada a Objetos. Você verá informações interessantes e importantes que são específicas para a área de progra- mação. Aprender esta disciplina certamente irá mudar o seu modo de pensar a respeito de desenvolvimento de software e até mesmo em outros campos de sua vida. O tema é muito abrangente e precisa muito de sua interpretação. Portanto, sugiro que você participe dos fóruns, de discussões com colegas, faça a leitura da apostila e realize todas as atividades. Tem muito material para abstrair aqui. Espero que a construção do seu conhecimento seja rica e proveitosa. Você pode acrescentar mais informações realizando pesquisas orientadas na internet. Espero contribuir para seu crescimento no aprendizado e despertar em você a von- tade de moldar seu modelo mental, segundo um novo paradigma: a orientação a objetos. Objetivos da disciplina Esperamos que, até o final da disciplina, você: • Examine os conceitos de Orientação a Objetos. • Identifique um objeto. • Nomeie os componentes que formam um objeto. • Descreva o conceito de objetos para repensar seus trabalhos na área de Aná- lise de Sistemas. • Use a lógica de objetos em seus próximos trabalhos. 6 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO > FIGURA 1 - Gato preto 14 > FIGURA 2 - Diagrama polimórfico da classe pessoa 21 > FIGURA 3 - Utilizando o Visual Studio 27 > FIGURA 4 - Saída na console - params 51 > FIGURA 5 - Saída na console - coleções 53 > FIGURA 6 - Saída na console – manuseando coleções 54 > FIGURA 7 - Saída na console – manuseando coleções 2 55 > FIGURA 8 - Saída na console – manuseando coleções 3 56 > FIGURA 9 - Saída na console – enumeradores 59 > FIGURA 10 - Figura 1- Serviços em comunicação 106 > FIGURA 11 - Relacionamento entre as classes 111 LISTA DE FIGURAS 7 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO LISTA DE QUADROS > QUADRO 1 - Variáveis vs Métodos 15 > QUADRO 2 - Tipos de variáveis 22 8 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO SUMÁRIO 1UNIDADE 3UNIDADE 2UNIDADE 1 CONCEITOS DE ORIENTAÇÃO A OBJETOS 13 1.1 HISTÓRICODA PO 13 1.2 CONCEITOS 14 1.2.1 VARIÁVEIS 15 1.2.2 MÉTODOS 16 1.2.3 CLASSES 16 1.2.4 OBJETO 17 1.2.5 HERANÇA 18 1.2.6 ENCAPSULAMENTO 19 1.2.7 POLIMORFISMO 20 1.2.8 CONSTRUTORES 22 1.2.9 DESTRUTORES OU FINALIZADORES 23 CONCLUSÃO 24 2 INTRODUÇÃO À PROGRAMAÇÃO EM C# 26 2.1 INTRODUÇÃO AO C# E AO.NET FRAMEWORK 26 2.1.1 OLA MUNDO – COMPILANDO SEU PRIMEIRO PROGRAMA 27 2.1.1.1 O MÉTODO PRINCIPAL: O MÉTODO MAIN() 28 2.1.1.2 ENTRADA E SAÍDA 28 2.2 A ESTRUTURA DE UM CÓDIGO EM C# 28 2.2.1 IMPLEMENTANDO OS CONCEITOS 30 2.2.1.1 TIPOS DE REFERÊNCIA 30 2.2.1.2 DECLARANDO CLASSES 30 2.2.1.3 ACESSANDO VARIÁVEIS E MÉTODOS DENTRO DE UM OBJETO 31 2.2.1.4 CRIANDO OBJETOS 33 2.2.1.5 HERANÇA DE CLASSES 33 2.2.1.6 POLIMORFISMO 36 2.2.1.7 ENCAPSULAMENTO 37 CONCLUSÃO 38 3 PROGRAMAÇÃO EM C# - NÍVEL BÁSICO 40 3.1 MODIFICADORES DE ACESSO EM C# 40 3.1.1 PUBLIC 41 3.1.2 PRIVATE 41 3.1.3 INTERNAL 42 9 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO 3.1.4 PROTECTED 43 3.1.5 ABSTRACT 44 3.1.6 CONST 44 3.1.7 SEALED 45 3.1.8 STATIC 45 3.1.9 VIRTUAL 46 3.2 PASSANDO PARÂMETROS EM C# 47 3.2.1 VALUE 47 3.2.2 OUT 47 3.2.3 REF 48 3.2.4 PARAMS 49 3.3 COLEÇÕES 52 3.3.1 MANUSEANDO COLEÇÕES 52 3.3.1.1 GET; E SET; 57 3.4 ESTRUTURAS (STRUCTS) 58 3.5 ENUMERADORES (ENUMS) 59 CONCLUSÃO 60 4 PROGRAMAÇÃO C# - NÍVEL INTERMEDIÁRIO 62 4.1 STRINGS 62 4.1.1 DECLARAÇÃO E INICIALIZAÇÃO DE STRINGS 62 4.1.2 IMUTABILIDADE DE STRINGS 63 4.1.3 LITERAIS DE CADEIA DE CARACTERES REGULARES E TEXTUAIS 64 4.1.4 SEQUÊNCIAS DE ESCAPE DE CADEIA DE CARACTERES 64 4.1.5 CADEIA DE CARACTERES DE FORMATO 65 4.1.6 SUBCADEIAS DE CARACTERES 65 4.1.7 SUBSTRING 65 4.1.8 INDEXOF 66 4.1.9 CONCATENAÇÃO DE STRINGS 68 4.1.10 STRINGBUILDER() 68 4.1.11 SPLIT 69 4.1.12 PESQUISA EM CADEIA DE CARACTERES 70 4.1.13 VERIFICANDO PADRÕES COM EXPRESSÕES REGULARES 71 4.1.14 VERIFICANDO SE UMA CADEIA DE CARACTERES REPRESENTA UM NÚ- MERO 74 4.2 PALAVRAS RESERVADAS 75 4.2.1 PALAVRAS-CHAVE CONTEXTUAIS 76 CONCLUSÃO 77 4UNIDADE 10 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 5 PROGRAMAÇÃO C# - NÍVEL AVANÇADO 79 5.1 DELEGADOS ( DELEGATES) 79 5.1.1 DELEGATES – REUTILIZAÇÃO DE CÓDIGO 82 5.2 CALLBACK OU FUNÇÕES DE RETORNO DE CHAMADA 93 5.3 TRATAMENTO DE EXCEÇÕES 98 5.3.1 O QUE É UMA EXCEÇÃO? 98 5.3.2 A ANATOMIA DAS EXCEÇÕES C # 98 5.3.3 EXEMPLO #1: O BLOCO BÁSICO “TRY CATCH FINALLY” 99 5.3.4 EXEMPLO #2 : FINALLY 101 5.3.5 EXCEÇÕES COMUNS DO .NET 102 CONCLUSÃO 103 6 CRIANDO UM CLIENTE PARA WEB SERVICES 105 6.1 WEB SERVICES – DEFINIÇÃO 105 6.1.1 SOA – SERVICE ORIENTED ARCHITECTURE 105 6.1.2 SERVIÇOS 106 6.1.3 API 106 6.1.4 JSON 107 6.2 NOSSO CLIENTE 107 6.2.1 PLANEJANDO O CONSUMO DO WEB SERVICE 108 6.2.2 QUAL A API VAMOS UTILIZAR 108 6.2.3 DESENVOLVENDO O CLIENTE 109 6.2.4 O RELACIONAMENTO ENTRE AS CLASSES 111 6.2.5 PASSO 1 – DECLARANDO AS NOSSAS CLASSES 111 6.2.6 FUNÇÃO PARA LER OS DADOS PRINCIPAIS DA API 113 6.2.7 BAIXANDO O JSON 114 6.2.8 DESSERIALIZANDO O JSON 115 6.2.9 O MÉTODO LÊ DETALHE 116 6.3 O CÓDIGO FONTE 116 CONCLUSÃO 122 GLOSSÁRIO 123 REFERÊNCIAS BIBLIOGRÁFICAS 124 5UNIDADE 6UNIDADE 11 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO ICONOGRAFIA ATENÇÃO PARA SABER SAIBA MAIS ONDE PESQUISAR DICAS LEITURA COMPLEMENTAR GLOSSÁRIO ATIVIDADES DE APRENDIZAGEM CURIOSIDADES QUESTÕES ÁUDIOSMÍDIAS INTEGRADAS ANOTAÇÕES EXEMPLOS CITAÇÕES DOWNLOADS 12 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO OBJETIVO Ao final desta unidade, esperamos que possa: > Apontar os conceitos básicos de orientação a objetos. > Aplicar seus conhecimentos e modele seus próprios objetos. UNIDADE 1 13 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO 1 CONCEITOS DE ORIENTAÇÃO A OBJETOS Nesta unidade, aprenderemos o histórico da Programação Orientada a Objetos, os motivos de sua criação e seus conceitos básicos. 1.1 HISTÓRICO DA PO Tudo começou na década de 60. Os sistemas estavam cada vez mais complexos e os códigos-fonte estavam gigantescos. Dar manutenção ou implementar alguma nova função nesse sistema tornou-se um trabalho árduo e, na maioria das vezes, apare- ciam erros na aplicação que eram inesperados. Houve então a necessidade de criar uma metodologia de implementação que fosse capaz de abstrair e modularizar estas estruturas de código. A PO permite a modularização através do conceito de classes (iremos abordar adian- te) e permite a reutilização de código através de herança (também iremos abordar mais tarde). Sempre que for desenvolver alguma coisa em PO, se o seu códi- go está grande demais, você está fazendo errado. Sempre pense o que motivou a criação da PO. Na década de 60, foi introduzido o conceito de classe numa linguagem de progra- mação chamada Simula 67, criada na Noruega, por Kristen Nygaard e Ole-Johan Dal. Essa linguagem era uma extensão do Algol 60. No entanto, a primeira linguagem a utilizar os conceitos da PO foi a SmallTalk, na déca- da de 70, puramente orientada a objetos. Tudo nela é objeto. Não existem tipos primiti- vos. String, números e caracteres são classes em Smalltalk. Possui um código extrema- 14 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO mente fácil de ler e, por isso, pode ser considerada uma boa linguagem para iniciantes. Java, C#, Python, PHP, Object Pascal são exemplos de linguagens orientadas a obje- tos, no entanto, C++ e PERL, por exemplo, apesar de possuírem o conceito de classes, se utilizarmos um conceito mais rigoroso, não são consideradas linguagens orienta- das a objetos. 1.2 CONCEITOS A PO tenta copiar no máximo possível os conceitos do mundo real. Pense bem, o mundo é composto por objetos que possuem características (variáveis) e podem ou não ser proativos ou responsivos (funções). Por exemplo, vamos analisar um gato: FIGURA 1 - GATO PRETO Fonte: Shutterstock, 2018 15 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO QUADRO 1 - VARIÁVEIS VS MÉTODOS CARACTERÍSTICAS OU VARIÁVEIS AÇÕES OU FUNÇÕES Cor Raça Temperamento Mia Caça Arranha Fonte: Elaborado pelo autor. Uma aplicação desenvolvida em PO é composta por um ou mais objetos e ações. Uma ação se inicia ao enviar uma mensagem a um objeto, e o objeto trata esta men- sagem causando algum resultado. A mensagem possui tudo o que é necessário para que o objeto atue conforme o recebido. Isso quer dizer que a mensagem possui pa- râmetros. No caso do gato acima: Na mensagem Gato caça Rato -> Gato é o objeto, Caça é a ação e Rato é o parâmetro desta mensagem. Isso é possível somente se a mensagem se comunicar com o objeto correto, utilizan- do a ação correta (função) e o parâmetro correto. Por exemplo: Gato Late Alto -> Gato é o objeto, Late é a ação (função) e Alto é o parâmetro. Esta mensagem causaria um erro em seu código, pois nosso objeto (o gato) não pos- sui a função “Late”. 1.2.1 VARIÁVEIS A variável possui um tipo de dados (caractere, decimal, inteiro) que define qual tipo de informação será armazenado nela. 16 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 1.2.2 MÉTODOS Métodos são as funções de uma classe. As funções processam informações e fazem o tratamentode dados de acordo com a necessidade da classe. É um bloco de código que contém instruções e, ao final do processamento dessas instruções, podem ou não retornar valores ao objeto que o invocou. 1.2.3 CLASSES Uma classe é o tipo de dados que define um objeto. É muito fácil de entender, olhe só: Uma variável pode ser do tipo inteiro (representa números inteiros), decimal, pode ser string (um conjunto de caracteres), etc. Do mesmo jeito, um objeto pode ser de um tipo determinado. Imaginemos uma classe que represente um automóvel. Ela tem variáveis e funções: Public class automovel { // Abaixo as variáveis string modelo; // String porque o modelo pode ser “Gol”,”Uno”,”Opala” string fabricante; // “Fiat”, “Ferrari”, “Audi”, “Honda” int ano; // pode ser representados por números inteiros: 1999, 2015, 2018 double valor// pode ser representado por números decimais: 2000, 55000.80 // Abaixo as funções ou métodos. // A função abaixo é para controlar a velocidade do carro. public acelerar (double velocidadeDesejada) { } 17 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO // Esta é para freiar. public frear() { } } (Este exemplo foi feito em C#, linguagem que iremos abordar mais adiante.) Então, concluímos que, qualquer objeto da classe automóvel, possui as variáveis: mo- delo, fabricante, ano e as funções acelerar (cujo parâmetro é a velocidade desejada) e a função frear, que não possui nenhum parâmetro. Utilizamos aqui a notação CamelCase. Com esta notação, é mais fácil entender o código. Inicia-se a palavra com maiúscula ou minúscula e cada palavra que compõe o nome do objeto é ini- ciada em letras maiúsculas. Por exemplo: CarroDoAno, Casa- DaFazenda, jogadorDeFutebol, pilotoDeAviao, etc. 1.2.4 OBJETO Os objetos são as principais estruturas de uma aplicação. Um objeto pode ou não pertencer a uma classe (lembre-se que o normal é que per- tença) e ter todas as características dessa classe. Possui as mesmas variáveis e métodos de uma classe e pode possuir variáveis e mé- todos que não estão na classe. Por exemplo, eu tenho um objeto chamado meuCarro. Enquanto não defini-lo, ele não tem método ou atributo algum. Porém, se falarmos que ele é um objeto da classe automovel, ele terá as variáveis da classe e os mesmos métodos. 18 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Exemplo: automovel meuCarro = new automovel; Estamos dizendo que o objeto meuCarro é agora da classe automovel. Imagine uma classe que represente o seguinte automóvel: Defina o objeto, seus variáveis e seus métodos. Discuta com seus colegas. Encontre erros e alternativas para melhorar a definição. 1.2.5 HERANÇA A herança acontece quando criamos uma classe que herda (deriva) a estrutura de outra classe. Por exemplo: vamos supor que exista uma classe de meios de transporte: public class meioDeTransporte { string combustivel; // pode ser “gasolina”,”diesel”,”álcool”, “energia elétrica” double capacidade; // 500, 1000, 2000 (em quilogramas) int numPassageiros; 5, 40 (num ônibus), 120 (avião) } 19 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO No entanto queremos criar uma outra classe que defina aviões, que também é um meio de transporte que possui todas as características da classe meioDeTransporte e mais algumas que são peculiares: public class avioes: meioDeTrasporte // Desse forma, dizemos que a classe avioes herda as características da classe meioDe- Transporte { int numeroDeTripulantes; // pode ser 1,5,10,12 int numeroDeTurbinas ; } Isso significa que a classe avioes possui as variáveis combustível, capacidade e num- Passageiros da classe meioDeTransporte, além das variáveis numeroDeTripulantes e numDeTurbinas. Podemos dizer que a classe meioDeTransporte é a classe pai de avioes ou superclasse e que avioes é subclasse de meioDeTransporte. 1.2.6 ENCAPSULAMENTO Encapsulamento é o meio pelo qual a PO implementa a abstração de dados, isto é, esconder os detalhes da implementação classe. Por que usamos o encapsulamento? Porque na PO um objeto não deve permitir que outros objetos acessem seus dados diretamente. Isso evita que ocorram erros de implementação. 20 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Para fazer o encapsulamento, declaramos o atributo que desejamos encapsular como privado da classe (private). Pensemos numa conta bancária de maneira simplificada: public class contaBancaria { private double saldo; // o saldo que queremos manter privado public void retira (double valor) { this.saldo -= valor; } // funcao para sacar public void deposita (double valor) { this.saldo += valor; } // funcao para retirar } Imagine se o saldo fosse público. Seria muito fácil adulterar o seu valor através de outra classe. No entanto, como declaramos o saldo como private (privado) somente as funções dentro da classe podem alterar seu valor. No encapsulamento, nós mos- tramos o que deve ser feito, não como deve ser feito. 1.2.7 POLIMORFISMO Como o próprio nome diz, é a capacidade de um objeto ter várias formas. Na prática, trata-se de uma subclasse (classe que herdou características de outra classe) que te- nha métodos com o mesmo nome dos métodos da superclasse que se comportem de maneira diferente, de acordo com a classe que o implementa. Suponhamos que existam duas classes diferentes: uma de pessoa física, outra de pes- soa jurídica. Essas duas classes são derivadas da classe pessoa. No entanto, cada uma valida o número do documento de maneira diferente, pois pessoa física utiliza CPF e pessoa jurídica utiliza CNPJ. 21 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO FIGURA 2 - DIAGRAMA POLIMÓRFICO DA CLASSE PESSOA Fonte: Elaborado pelo autor public class pessoa { public string name; public string numDocumento; public virtual void validar() { // um código genérico qualquer } } class pessoaFisica { public override void validar (string CPF) { // código para validar CPF } } 22 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO class pessoaJuridica { public override void validar (string CPF) { // código para validar CPF } } Como você pôde observar, nós sobrescrevemos (override) o método validar tanto na classe pessoaFisica quanto na classe pessoaJuridica, isto é, realizamos um polimorfis- mo com a classe pessoa. 1.2.8 CONSTRUTORES Toda vez que instanciamos uma classe, é invocado um construtor. Pense num cons- trutor como um método de inicialização. Uma classe pode possuir um ou mais cons- trutores, mas, se não for declarado um construtor, o compilador gera um construtor padrão baseado na tabela de valor padrão: QUADRO 2 - TIPOS DE VARIÁVEIS TIPO VALOR PADRÃO bool False byte 0 char ‘\0’ decimal 0M double 0,0D enum O valor produzido pela expressão (E)0, em que E é o identificador de enumeração. float 0,0F Int 0 long 0L sbyte 0 short 0 struct O valor produzido pela configuração de todos os campos tipo-valor para seus valores padrão e todos os campos tipo-referência para null. uint 0 ulong 0 ushort 0 23 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO Em termos de sintaxe, um construtor possui o mesmo nome da classe a qual ele pertence: publicclass pessoa { private string primeiroNome; private string segundoNome; public pessoa (string nome, string sobrenome) { primeiroNome = nome; segundoNome = sobrenome } // restante do código de implementação da classe } Um construtor não retorna valor algum! Quando criamos mais de um construtor para uma classe, estamos realizando uma sobrecarga de construtores. 1.2.9 DESTRUTORES OU FINALIZADORES Destrutores são utilizados para destruir instâncias de classes. Não podem ser herdados ou sobrecarregados (ter mais de um numa classe). Eles não podem ser invocados. São invocados automaticamente. Quando um objeto não está sendo mais usado, o coletor de lixo (garbage Collector – que gerencia a alo- cação e liberação de memória do aplicativo) invoca o destrutor e recupera a memória que estava sendo utilizada para armazenar o objeto. Não podem ter parâmetros. Pense num destrutor como um construtor executado ao destruirmos uma classe. 24 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO class exemplo { ~exemplo () { System.Diagnostics.Trace.WriteLine(“Destrutor da classe exemplo invo- cado”) } } Possuem o mesmo nome da classe com um “~” (til) no início. CONCLUSÃO A programação orientada a objetos tenta reproduzir o mundo real através de variá- veis e métodos que definem o comportamento de uma classe. Quase qualquer coisa (não me arrisco a dizer tudo) pode ser tratada como uma clas- se. Pense no seu dia a dia! Imagine coisas do seu cotidiano que possam ser tratadas como classe. Faça a leitura deste material e, se for necessário, leia novamente os conceitos apre- sentados, pois eles são fundamentais para a construção do seu conhecimento. Em caso de dúvidas, veja a bibliografia recomendada ou faça uma pesquisa orienta- da na internet de acordo com o que foi apresentado neste material. 25 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO OBJETIVO Ao final desta unidade, esperamos que possa: > Manipular classes. > Manipular Variáveis e métodos. > Usar Herança. > Usar Polimorfismo. > Usar Encapsulamento. > Aplicar a estrutura de um programa em C#. > Identificar Interfaces. UNIDADE 2 26 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 2 INTRODUÇÃO À PROGRAMAÇÃO EM C# Caro aluno, nesta unidade, você dará os primeiros passos para aprender a desenvolver aplicativos em C#. Estaremos seguindo dos padrões da Microsoft (desenvolvedora da lingua- gem) para implementar todos os conceitos básicos de Programação Orientada a Ob- jetos, bem como outros mais avançados, próprios de C#. Então, iniciemos nossa jornada! 2.1 INTRODUÇÃO AO C# E AO.NET FRAMEWORK A linguagem C# é uma linguagem muito poderosa, mas também simples e fácil de aprender. Se você já conhece C, C++ ou Java, vai aprender mais rápido ainda. Por ser uma linguagem orientada a objetos, C# permite a fácil implementação de conceitos de Herança, Encapsulamento e Polimorfismo. Todas as variáveis e métodos, inclusive o método Main(), que é o método principal do aplicativo, são encapsulados na definição de classe. Quem já conhece C e C++, vai notar que compilação de C# é bem parecido e mais fácil que o de Java. 27 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO 2.1.1 OLA MUNDO – COMPILANDO SEU PRIMEIRO PROGRAMA Para criar um aplicativo de console, siga os seguintes passos: FIGURA 3 - UTILIZANDO O VISUAL STUDIO Fonte: Elaborado pelo autor Apague todo o código de Program.cs e substitua pelo seguinte código: using System; namespace OlaMundo{ class Ola{ static void Main(){ Console.WriteLine(“Ola Mundo”); Console.WriteLine(“Pressione qualquer tecla para sair”); Console.ReadKey(); } } } 28 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Pronto! Agora, pressione F5 para executar seu código. Veja que aparece a janela do console com a mensagem “Ola Mundo”. 2.1.1.1 O MÉTODO PRINCIPAL: O MÉTODO MAIN() Uma aplicação em C# possui o método Main. É nele que tudo começa e termina. É nele que você executa e cria outros métodos. O método Main é um método estático (pode ser chamado mesmo quando a classe não foi instanciada). 2.1.1.2 ENTRADA E SAÍDA Como você pôde ver no código acima, utilizamos a classe Console que possui o méto- do WriteLine, que é de saída da classe Console, e possui como parâmetro uma string. Quando executado, envia a string para a Console. Para receber uma tecla qualquer do teclado, utilizamos o método ReadKey da classe console. Ele espera que o usuário pressione qualquer tecla. 2.2 A ESTRUTURA DE UM CÓDIGO EM C# Os aplicativos em C# podem conter vários arquivos, e cada arquivo pode conter zero ou mais namespaces, e um namespace pode conter classes, estrutura, interfaces, nu- merações e delegados: 29 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO // O esqueleto de um programa em C# using System; namespace SeuNamespace; { class SuaClasse { } struct SuaEstrutura { } interface SuaInterface { } delegate int SeuDelegado(); enum SeuEnum { } namespace SeuNamespaceDentroDaClasse { struct SuaEstrutura { } } class SuaClassePrincipal { static void Main(string[] args) { // Seu programa inicia aqui } } } 30 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 2.2.1 IMPLEMENTANDO OS CONCEITOS A partir de agora, é muito importante que você tenha os conceitos de Programação Orientada a objetos em sua cabeça. 2.2.1.1 TIPOS DE REFERÊNCIA Como bem sabemos, classe é como se fosse um tipo de dados. No caso, classe é um tipo de referência. Isso significa que, quando você declara uma variável com um tipo de referência, ela fica com valor null até que você a instancie com o operador new ou atribua a ela um objeto criado em outro lugar. MinhaClasse mc = new MinhaClasse(); MinhaClasse mc2 = mc; 2.2.1.2 DECLARANDO CLASSES Para se declarar uma classe, utiliza-se a palavra class e, precendendo a palavra class, declara-se o nível de acesso. public class Cliente { // Código da classe } Neste caso, declaramos uma classe com nível de acesso público. Isso significa que qualquer um pode criar novas instâncias. No corpo da classe, declaramos as variáveis e métodos. 31 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO 2.2.1.3 ACESSANDO VARIÁVEIS E MÉTODOS DENTRO DE UM OBJETO Para acessar as variáveis e métodos de um objeto, utilizamos a seguinte sintaxe: <nome do objeto>.<nome da variável > ou <nome do objeto>.<nome do método> Suponha que estamos trabalhando com a seguinte classe: public class Cliente { string nome; string sobrenome; public void EscreveNaConsole() { Console.WriteLine(“Ola “ + nome + “ “ + sobrenome); Console.WriteLine(“Pressione qualquer tecla para sair”); Console.ReadKey(); } } Em primeiro lugar, precisamos instanciar a classe porque ela, por si só, é um tipo: static void Main(){ Cliente objetoCliente = new Cliente(); } Depois acessamos seu conteúdo: static void Main() { Cliente objetoCliente = new Cliente(); // Acessando as variáveis objetoCliente.nome = “Fulano”; 32 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABADA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO objetoCliente.sobrenome = “de tal”; // Acessando o método objetoCliente.EscreveNaConsole(); } O código completo fica assim: using System; namespace exemploCliente { class exemplo { public class Cliente { public string nome; public string sobrenome; public void EscreveNaConsole(){ Console.WriteLine(“Ola “ + nome + ‘ ‘ + sobrenome); Console.WriteLine(“Pressione qualquer tecla para sair”); Console.ReadKey(); } } static void Main() { Cliente objetoCliente = new Cliente(); // Acessando as variáveis objetoCliente.nome = “Fulano”; objetoCliente.sobrenome = “de tal”; // Acessando o método objetoCliente.EscreveNaConsole(); } } } 33 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO Sempre que tiver dúvidas sobre como estruturar o código utili- zando classes, métodos e variáveis consulte o item A estrutura de um código em C#. Teste o código acima em seu computador. 2.2.1.4 CRIANDO OBJETOS Embora se pareçam muito, uma classe e um objeto não são a mesma coisa. Uma classe é um tipo, e o objeto é algo que possui o tipo. Um objeto muitas vezes é uma instância de uma classe. Criamos objetos também pela utilização do operador new. Cliente objeto1 = new Cliente(); No exemplo acima, instanciamos a classe Cliente no objeto objeto1, isto é, o objeto1 passa a ser uma representação concreta da classe Cliente, com seus métodos e va- riáveis. 2.2.1.5 HERANÇA DE CLASSES Para que se possa criar uma classe, que é subclasse de uma superclasse, usamos a seguinte sintaxe: <Nível de Acesso> class <nome da classe>: <nome da superclasse>. No exemplo abaixo: 34 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO public class meioDeTransporte { public string combustivel; // pode ser “gasolina”,”diesel” public double capacidade; // 500, 1000, 2000 (em kg) public int numPassageiros; // 40 (num ônibus), 120 (avião) } public class avioes:meioDeTransporte { public int numeroDeTripulantes; // pode ser 1,5,10 public int numeroDeTurbinas; public void EscreveNaConsole() { Console.WriteLine(“O aviao usa o combustivel “ + combustivel + “ e “ + numeroDeTurbinas.ToString() + “ turbinas “); } } A classe avioes herda da classe meioDeTransporte as variáveis combustível, capacida- de e numPassageiros, e ainda acrescenta mais 2: numeroDeTripulantes e numeroDe- Turbinas. Além disso, implementa o método EscreveNaConsole. O código completo fica assim: using System; namespace exemploHeranca { class MainClass { public class meioDeTransporte { public string combustivel; // pode ser “gasolina”,”diesel”,”álcool” public double capacidade; // 500, 1000, 2000 (em quilogramas) public int numPassageiros; // 40 (num ônibus), 120 (avião) } 35 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO // Aqui avioes herda de meioDeTransporte public class avioes:meioDeTransporte { public int numeroDeTripulantes; // pode ser 1,5,10,12 public int numeroDeTurbinas; public void EscreveNaConsole() { Console.WriteLine(“O aviao usa o combustivel “ + combus- tivel + “ e “ + numeroDeTurbinas.ToString() + “ turbinas “); } } public static void Main() { // Instanciamos a classe avioes avioes objetoAvioes = new avioes(); // Atribuimos valores as variáveis objetoAvioes.combustivel = “gasolina”; objetoAvioes.capacidade = 500; objetoAvioes.numPassageiros = 130; objetoAvioes.numeroDeTripulantes = 5; objetoAvioes.numeroDeTurbinas = 4; objetoAvioes.EscreveNaConsole(); } } } Reparou que não foi preciso reescrever o código de meioDeTransporte dentro da classe avioes e que o objeto objetoAvioes acessou as variáveis herdadas da superclas- se meioDeTransporte? Este é um bom exemplo de reutilização de código, um dos motivadores da criação 36 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO de programação orientada a objetos. Escreva o código acima e teste. Preste atenção no código e altere a função Escreve- NaConsole para escrever algum outra variável do objeto objetoAvioes. 2.2.1.6 POLIMORFISMO A maneira correta de se fazer Polimorfismo em C# é fazer uma classe herdar de uma superclasse e sobrescrever o método que se deseja com o operador override. Vamos usar o mesmo exemplo do item anterior: public class meioDeTransporte { public string combustivel; // pode ser “gasolina”,”diesel” public double capacidade; // 500, 1000, 2000 (em quilogramas) public int numPassageiros; // 40 (num ônibus), 120 (avião) ublic virtual void EscreveNaConsole() { Console.WriteLine(“O aviao usa o combustivel “ + combustivel); } } Repare que declaramos a função EscreveNaConsole dentro da classe meioDeTrans- porte, entretanto ela somente escreve o combustível que o avião usa. Só alteramos uma coisa: colocamos o operador virtual na declaração do método. Esse operador indica que o método pode sofrer um override de uma subclasse. Como fazer então para que obtenhamos o mesmo resultado do exemplo anterior, isto é, o combustível e o número de turbinas escritos na console? É simples, utilizamos o Polimorfismo: 37 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO public class avioes:meioDeTransporte { public int numeroDeTripulantes; // pode ser 1,5,10,12 public int numeroDeTurbinas; public override void EscreveNaConsole(){ Console.WriteLine(“O aviao usa o combustivel “ + combustivel + “ e “ + numeroDeTurbinas.ToString() + “ turbinas “); } } Repare que na classe avioes reescrevemos o método EscreveNaConsole com o ope- rador override na declaração do método. Isso faz com que a classe EscreveNaConsole herdada de meioDeTransporte seja reescrita dentro da classe avioes. Experimente implementar este Polimorfismo no exemplo anterior. Edite o código conforme apresentado aqui. 2.2.1.7 ENCAPSULAMENTO Para encapsular métodos e variáveis em uma classe, basta declará-los como private ao invés de public. Lembra-se do exemplo da conta bancária da unidade 1? Em C#, ele ficaria assim: public class contaBancaria { private double saldo; //o saldo que queremos manter privado public void retira(double valor) // funcao para sacar { this.saldo -= valor; } public void deposita(double valor) { this.saldo += valor; } // funcao para depositar } 38 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Veja o que aconteceu: protegemos a variável saldo da conta bancária de ser acessado por outros objetos. O escopo dele é somente dentro da classe contaBancaria e, no entanto, temos dois métodos públicos para alterar o saldo. Isso significa que o saldo final não pode ser alterado diretamente por outros objetos, e sim pelos métodos cor- retos que criamos para alterá-lo. CONCLUSÃO Vimos aqui como implementar os principais conceitos de orientação a objetos em C#. Percebeu que, quando você se acostuma a pensar nesse paradigma, as coisas ficam mais fáceis? Agora, sabemos como é a estrutura de programa C#. Podemos declarar variáveis e métodos, implementar herança, encapsulamento e polimorfismo em nosso código. Foi demonstrado nos exemplos acima como evitar reutilização de código e como proteger variáveis dentro de uma classe. Pense em outras situações para cada umdos exemplos acima. 39 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO OBJETIVO Ao final desta unidade, esperamos que possa: > Criar métodos com diferentes tipos de modificadores. > Criar métodos que aceitem parâmetros por valor e referência. > Aplicar estruturas corretamente. > Aplicar enumeradores corretamente. UNIDADE 3 40 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 3 PROGRAMAÇÃO EM C# - NÍVEL BÁSICO Nesta unidade, aprenderemos conceitos básicos de C#. Este conteúdo é uma pre- paração para que você aprenda a desenvolver, por meio de modificadores de acesso, suas próprias classes, variáveis e membros. Você aprenderá como passar parâmetros por valor e referência. Outro conhecimento que será construído se refere a estruturas e enumeradores. Seja bem-vindo! 3.1 MODIFICADORES DE ACESSO EM C# A sintaxe de declaração de uma função é: <escopo><tipo><nome do metodo>(<parâ- metros>). Vamos ampliar o conceito de “escopo”. “Escopo” foi utilizado como recurso didático para implementar um método como público ou privado, que era o nosso de conhe- cimento. Agora, expandiremos “escopo” para “modificadores de acesso”, pois aquele lugar na declaração do método pode fazer muito mais que somente dizer se um método é público ou privado. O mesmo funciona para classes. Os modificadores de acesso são operadores que especificam a acessibilidade decla- rada de um membro ou tipo. A seguir, uma lista dos modificadores mais utilizados: • public: não existe restrição de acesso. • 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 deriva- dos da classe que os contêm. • private: o acesso é limitado ao tipo recipiente. 41 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO • private protected: o acesso é limitado à classe que o contém ou a tipos deriva- dos da classe que o contém no assembly atual. • abstract: define que uma classe destina-se somente a ser uma classe base para outras classes (muito parecido com interface). • const: indica que o valor do campo ou variável não pode ser alterado. • sealed: indica uma classe que não pode ser herdada. • static: declara um membro estático que pertença ao próprio tipo, em vez de um objeto específico. • virtual: declara um método que pode ser alterado por classes filhas. 3.1.1 PUBLIC Não há nenhuma restrição para acesso. É o modificador mais permissivo de todos. É um modificador de acesso para tipo e membros de tipo. public class classePublica { public int x; //sem restricao de acesso } 3.1.2 PRIVATE É um modificador de acesso de membro. É o nível de acesso menos permissivo. Em classes ou structs, somente internamente os membros podem ser acessados. class empregado { private double salario; } No exemplo acima, a variável salario pode ser acessada apenas pelos métodos da classe empregado. Em algumas classes, é necessário proteger algumas variáveis e métodos de acessos externos. Utilizamos o operador private para implementar essa proteção. 42 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 3.1.3 INTERNAL Utilizado normalmente em desenvolvimento baseado em componentes, ele permite que um grupo de componentes colabore de maneira particular, sem serem expostos para o restante do código do aplicativo. // Assembly1.cs // Compile with: /target:library internal class ClasseBase { public static int intM = 0; } Quando a classe sofrer a tentativa de ser instanciada num assembly diferente, ocor- rerá um erro: // Assembly1_a.cs // Compile with: /reference:Assembly1.dll class TesteDeAcesso { static void Main() { ClasseBase minhaBase = new ClasseBase(); // CS0122 } } 43 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO 3.1.4 PROTECTED protected define que um membro só pode ser acessível por uma classe derivada. public class classeDerivada : classeMae { static void Main() { classeMae acesso1 = new classeMae(); // Instaciamos a ClasseMae classeDerivada acesso2 = new classeDerivada(); // Instanciamos a classeDe- rivada acesso1.protegido = 3; // Erro, pois acesso1 é classeMae instanciada // e nao derivada de classeMae acesso2.protegido = 5; // OK, acesso2 é instancia de classeDerivada // que é derivada de classeMae } } Mas o que é um assembly? Um assembly é um arquivo compilado, ou seja, um executável ou uma dll. 44 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 3.1.5 ABSTRACT O modificador abstract define que o item que está sendo declarado tem implemen- tação ausente ou incompleta. Pode ser usado com classes, métodos, propriedades, indexadores e eventos. Em uma declaração de classe, indica que essa classe é somen- te uma base para outras classes. abstract class pessoa { abstract public double calculaSalario(); } class folhaDePagamento : pessoa { public double salario = 0; public override double calculaSalario() { salario = 1000; return salario; } } Repare que o método calculaSalario teve de ser implementado na classe folhaDepa- gamento. Caso isso não fosse feito, seria gerado um erro. 3.1.6 CONST O modificador const identifica uma variável ou campo constante. Isso significa que não pode ser alterado em momento algum no código. Pode ser utilizado para intei- ros, decimais, caracteres e boolianos. const int x = 0; 45 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO 3.1.7 SEALED Quando uma classe é declarada com o modificador sealed, ela não pode ser herdada por nenhuma outra classe. Quando um método é declarado com sealed, não pode sofrer override em lugar nenhum. class empregado { public double salario = 0; //acesso restrito } sealed class empregadoVIP : empregado { public double bonus = 1000; } Nenhuma outra classe poderá herdar de empregadoVIP. 3.1.8 STATIC Declara um membro estático que pertença ao próprio tipo, em vez de um objeto específico. Uma classe estática não pode ser instanciada, ou seja, você não pode utilizar o opera- dor new() para associá-la a um objeto. Como uma classe estática não pode ser instanciada, um membro estático não pode ser acessado pela instância, mas pode ser acessado com o caminho completo do nome do tipo: public class minhaBase { public struct minhaEstrutura { public static int minhaVariavel = 0; 46 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO } } Para acessar o membro minhaVariavel, temos de utilizar o caminho completo: Console.WriteLine(minhaBase.minhaEstrutura.minhaVariavel); 3.1.9 VIRTUAL Paraimplementar polimorfismo, é necessário que na superclasse sejam indicados os métodos que podem sofrer alterações na classe filha por meio do operador override. Para isso, utilizamos o modificador de acesso virtual. public class testaOver { public virtual double calculaArea (double x, double y) { return x * y; } } public class alteraMetodo : testaOver { public override double calculaArea(double x, double y) { return (x * y)/2; } } Note que na classe mãe, o método que pode sofrer alterações deve ser declarado como virtual, e na classe filha deve ser declarado com o modificador override e ter exatamente a mesma assinatura. 47 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO 3.2 PASSANDO PARÂMETROS EM C# Parâmetros são meios de se passar valores para um método. A sintaxe correta é: <modificador> <Tipo de Dado> <Nome do parâmetro> São quatro as formas de se passar parâmetros em C#: • value. • out. • ref. • params. 3.2.1 VALUE value é a maneira com a qual estamos acostumados. Quando um parâmetro não tem um modificador, ele é tratado como value por default. Isso significa que se alte- rarmos o valor do parâmetro na função, a alteração somente ocorre dentro da função e não volta para o código que chamou a função. public double calculaArea(double x, double y) { return (x * y)/2; } } 3.2.2 OUT O modificador out passa um parâmetro por referência. Isso significa que caso o pa- râmetro seja alterado dentro da função, a variável que representa o parâmetro no código que chamou a função também será alterada. 48 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO static void Main() { void exemploOut(out double valor) { valor = 100; } double valorOriginal = 9; exemploOut(out valorOriginal); Console.WriteLine(valorOriginal); } O valor impresso na console será 100. Perceba que o modificador out deve preceder o parâmetro que está sendo passado no código chamador do método. 3.2.3 REF Parâmetros ref são de entrada e saída. Isso significa que eles podem ser usados tanto para passar um valor para uma função quanto para receber de volta esse valor. Um parâmetro ref precisa ser inicializado antes de ser passado para o método, enquanto parâmetros out não precisam ser inicializados. static void testeRef (ref int valor) { valor = valor + 100; } static void Main() { int valorOriginal = 10; 49 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO testeRef(ref valorOriginal); Console.WriteLine(valorOriginal); } O valor impresso na console será 110. Perceba que o modificador ref deve preceder o parâmetro a ser passado pelo código chamador da função. No fundo, um parâmetro por referência é um apelido para uma variável já existente em outro contexto. 3.2.4 PARAMS params é extremamente útil quando o número de argumentos a ser passado para o módulo é variável. O argumento precisa ser uma matriz unidimensional ou uma matriz de matrizes (jagged array). Você pode enviar uma lista separada por vírgulas dos argumentos do tipo especifica- do na declaração de parâmetros ou uma matriz de argumentos do tipo especificado. É possível também não enviar nenhum argumento. Se você não enviar nenhum ar- gumento, o comprimento da lista params será zero. Nenhum parâmetro adicional é permitido após a palavra-chave params em uma de- claração de método. Apenas uma palavra-chave params é permitida em uma decla- ração de método. public static void exemploParams(params int[] lista){ for (int i = 0; i < lista.Length; i++) { Console.Write(lista[i] + “ “); 50 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO } Console.WriteLine(); } public static void exemploParams2(params object[] lista) { for (int i = 0; i < lista.Length; i++) { Console.Write(lista[i] + “ “); } Console.WriteLine(); } static void Main() { // Você pode enviar uma lista com itens separados // por vírgula. exemploParams(1, 2, 3, 4); exemploParams2(1, ‘a’, “teste”); // Aceita zero argumentos. A chamada a seguir escreve // apenas uma linha exemploParams2(); // Uma matriz pode ser passada desde que seja // do tipo declarado na assinatura do método int[] minhaMatrizInt = { 5, 6, 7, 8, 9 }; 51 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO exemploParams(minhaMatrizInt); object[] minhaMatrizObj = { 2, ‘b’, “test”, “again” }; exemploParams2(minhaMatrizObj); // A chamada seguinte causaria um erro // porque object não pode ser convertido para int // exemploParams(minhaMatrizObj); // A chamada seguinte não causa erro, // mas matriz de inteiros torna-se o primeiro // item da matriz object exemploParams2(minhaMatrizInt); } Saída na console: FIGURA 4 - SAÍDA NA CONSOLE - PARAMS Fonte: Elaborado pelo autor, 2018. 52 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 3.3 COLEÇÕES Em muitos aplicativos, você terá a necessidade de agrupar variáveis ou objetos rela- cionados. Você pode lidar com isso de duas formas diferentes: usando matrizes ou coleções. int[] inteiros = new int[] { 1, 2, 3, 4 }; string[] comTamanho = new string[6]; //matriz de 6 itens string As matrizes são utilizadas para trabalhar com objetos fortemente tipados, enquanto as coleções são mais flexíveis. O tamanho de uma coleção pode crescer e diminuir dinamicamente e você também pode criar uma chave para que o acesso ao objeto da coleção seja mais rápido. Os exemplos a seguir usam a classe genérica List<T> (System.Collections.Generic), que habilita você a trabalhar com uma lista de objetos fortemente tipados. 3.3.1 MANUSEANDO COLEÇÕES O exemplo a seguir cria uma lista de nomes e, em seguida, lista os nomes na console por meio da instrução foreach(). static void Main() { var nomes = new List<string>(); nomes.Add(“Daniel”); nomes.Add(“Cacilda”); 53 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO nomes.Add(“Bertoldo”); nomes.Add(“Alberto”); foreach (var nome in nomes) { Console.Write(nome); Console.WriteLine(); } } Saída na console: FIGURA 5 - SAÍDA NA CONSOLE - COLEÇÕES Fonte: Elaborado pelo autor, 2018. Você também pode declarar uma coleção já inicializada, caso o conteúdo seja conhe- cido com antecedência: var nomes2 = new List<string> { “Frederico”, “Nicolau”, “Fiodor” }; Para acessar os elementos da coleção, você também pode utilizar for em vez defo- reach() : var nomes2 = new List<string> { “Frederico”, “Nicolau”, “Fiodor” }; 54 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO for (var indice = 0; indice < nomes2.Count; indice ++){ Console.Write(nomes2[indice]); Console.WriteLine(); } Saída na console: FIGURA 6 - SAÍDA NA CONSOLE – MANUSEANDO COLEÇÕES Fonte: Elaborado pelo autor, 2018. Você também pode remover um item de uma coleção: var nomes2 = new List<string> { “Frederico”, “Nicolau”, “Fiodor” }; nomes2.Remove(“Nicolau”); for (var indice = 0; indice < nomes2.Count; indice ++){ Console.Write(nomes2[indice]); Console.WriteLine(); } Saída na console: 55 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO FIGURA 7 - SAÍDA NA CONSOLE – MANUSEANDO COLEÇÕES 2 Fonte: Elaborado pelo autor, 2018. Removendo um elemento da coleção pelo índice: var nomes2 = new List<string> { “Frederico”, “Nicolau”, “Fiodor” }; for (var indice = 0; indice < nomes2.Count; indice ++){ if (indice == 2) { nomes2.RemoveAt(indice); } } for (var indice = 0; indice < nomes2.Count; indice++) { Console.Write(nomes2[indice]); Console.WriteLine(); } Você também pode ter uma coleção de classes: public class galaxia { public string nome { get; set; } 56 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO public double anosLuz { get; set; } } static void Main() { var galaxias = new List<galaxia> { new galaxia() {nome=”andromeda”,anosLuz=1000000}, new galaxia() {nome=”do Triangulo”,anosLuz=1233857}, new galaxia() {nome=”guardioes da”,anosLuz=934893948} }; foreach(galaxia item in galaxias) { Console.WriteLine (item.nome + “ distancia:” + item.anosLuz); } } Saída na console: FIGURA 8 - SAÍDA NA CONSOLE – MANUSEANDO COLEÇÕES 3 Fonte: Elaborado pelo autor, 2018. 57 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO 3.3.1.1 GET; E SET; get e set são chamados de propriedades automáticas. Uma propriedade (property) é um membro de uma classe que fornece um mecanis- mo flexível para ler, gravar ou calcular o valor de um dado em particular. As propriedades permitem que uma classe exponha de uma maneira pública a ob- tenção e definição desses valores. Na declaração: public class galaxia2 { public string nome { get; set; } } São essencialmente um atalho para: public class galaxia2 { private string _nome; public string nome { get { return this._nome; } 58 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO set { this.nome = “Daniel”; } } } 3.4 ESTRUTURAS (STRUCTS) Estruturas são estruturas de dados que podem possuir variáveis e funções (como as classes), mas, ao contrário das classes, elas não precisam de alocação de heap. Uma struct armazena diretamente seus dados, enquanto uma classe armazena uma re- ferência a um objeto alocado dinamicamente. Structs não implementam herança. Structs são úteis para estruturas de dados pequenas que têm semântica de valor, como coordenadas ou pares chave-valor em um dicionário, por exemplo. struct coordenadas { public double longitude, latidude; public void Ponto (double longitudeParam, double latitudeParam){ this.latidude = longitudeParam; this.longitude = longitudeParam; } } 59 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO 3.5 ENUMERADORES (ENUMS) Um enumerador é uma matriz de constantes. Por padrão, o primeiro enumerador tem o valor 0. O valor de cada enumerador se- guinte é incrementado em 1. Vantagens: • Você especifica claramente quais são os valores aceitáveis para uma variável. • O editor do Visual Studio lista automaticamente os valores definidos. enum diaSemana { Domingo, Segunda, Terca, Quarta, Quinta, Sexta, Sabado }; static void Main() { int x = (int)diaSemana.Domingo; int y = (int)diaSemana.Sexta; Console.WriteLine(“Domingo = {0}”, x); Console.WriteLine(“Sexta = {0}”, y); } Saída na console: FIGURA 9 - SAÍDA NA CONSOLE – ENUMERADORES Fonte: Elaborado pelo autor, 2018. 60 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO CONCLUSÃO Nesta unidade, aprendemos a usar novas estruturas do C#, como enumeradores, co- leções e structs, bem como esclarecemos o uso dos principais modificadores de aces- so do C#. Vimos como passar parâmetros e até mesmo como passar parâmetros para um mé- todo que tem um número indefinido de parâmetros. De agora em diante, podemos aprofundar nossos estudos e começar a pensar em desenvolver um aplicativo funcional. 61 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO OBJETIVO Ao final desta unidade, esperamos que possa: > Usar todos os conceitos de manipulação de strings; > Identificar quais são as palavras reservadas do C#. UNIDADE 4 62 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 4 PROGRAMAÇÃO C# - NÍVEL INTERMEDIÁRIO Nesta unidade estudaremos a manipulação de strings. Manipulação de strings é ex- tremamente útil para a confecção de webservices. Webservices são serviços de troca de mensagens na internet e estas mensagens são transmitidas como texto, mesmo que o layout seja um XML, por exemplo. Além disso, aprenderemos quais são as palavras reservadas que não podemos usar em nosso código fonte. 4.1 STRINGS Strings são cadeias de caracteres cujo texto é armazenado como uma coleção se- quencial somente de objetos char. Em C# a palavra string é um alias para String, então você pode escolher qualquer uma das 2 que preferir. A classe String fornece os métodos necessários para manipu- lação, inicialização e comparação de strings. 4.1.1 DECLARAÇÃO E INICIALIZAÇÃO DE STRINGS // Declarar sem inicializar. string mensagem1; // Iniciar em null. string mensagem2 = null; // Inicializar com um string vazia. // Use a constante Empty ao invés de “”. string mensagem3 = System.String.Empty; 63 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO // Inicializar com uma string literal string oldPath = “c:\\Program Files\\Microsoft Visual Studio 8.0”; // Use System.string se preferir. System.String greeting = “Ola mundo!”; // Em variáveis locais ( dentro do corpo de um método) // você pode utilizar o tipo implícito var temp= “Eu ainda sou uma string fortemente tipada!”; // Use uma string constante para evitar que mensagem4 // seja utilizada para armazenar outra string const string mensagem4 = “Você não pode se livrar de mim!”; // Use o construtor string somente quando // a string for um char*, char[], ou sbyte*. Veja // a documentação de System.String. char[] letras = { ‘A’, ‘B’, ‘C’ }; string alfabeto = new string(letras); Observe que utilizamos o operador new somente para inicializar uma string a partir de uma matriz de caracteres. 4.1.2 IMUTABILIDADE DE STRINGS Strings são imutáveis, isto é, não podem ser alterados depois de criados. Todos os métodos de System.string e operadores que são utilizados para modificar uma string na verdade criam um novo objeto e o objeto original é liberado para a coleta de lixo. No exemplo abaixo ao concatenar nome e sobrenome, é criada uma nova de cadeia de caracteres “nome”, e a original é liberada para a coleta de lixo. string nome = “joao”; string sobrenome = “ da silva”; nome += sobrenome; 64 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 4.1.3 LITERAIS DE CADEIA DE CARACTERES REGULARES E TEXTUAIS Use literais de cadeia de caracteres regulares quando você precisar inserir caracteres de escape fornecidos por C#, conforme mostrado no seguinte exemplo: string colunas = “coluna 1\tcoluna 2\ctoluna 3”; //Saída: coluna 1 coluna 2 coluna 3 string linhas = “linha 1\rlinha 2\rlinha 3”; /* Saída: linha 1 linha 2 linha 3 */ 4.1.4 SEQUÊNCIAS DE ESCAPE DE CADEIA DE CARACTERES Sequência de escape Nome do caractere Codificação Unicode \' Aspas simples 0x0027 \" Aspas duplas 0x0022 \\ Barra invertida 0x005C \0 Nulo 0x0000 \a Alerta 0x0007 \b Backspace 0x0008 \f Avanço de página 0x000C \n Nova linha 0x000A \r Retorno de carro 0x000D \t Tabulação horizontal 0x0009 \U Sequência de escape Unicode para pares substitutos. \Unnnnnnnn \u Sequência de escape Unicode \u0041 = "A" \v Tabulação vertical 0x000B \x Sequência de escape Unicode semelhante a "\u", exceto pelo comprimento variável. \x0041 = "A" 65 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO 4.1.5 CADEIA DE CARACTERES DE FORMATO Uma cadeia de caracteres de formato é aquela cujo conteúdo pode ser alterado em tempo de execução. Você utiliza o método estático format e chaves com espaços re- servados em tempo de execução : string s; s = System.String.Format(“{0} palavra {1} palavra {2} palavra”,”primeira”,”segunda”,”ter- ceira”); Console.WriteLine(s); Console.ReadKey(); Saída: 4.1.6 SUBCADEIAS DE CARACTERES Uma subcadeia de caracteres é uma cadeia de caracteres que está dentro de outra cadeia de caracteres, ou seja, uma string dentro de uma string. 4.1.7 SUBSTRING Utilize substring para extrair uma subcadeia de caracteres de uma cadeia de strings. public string Substring(int IndiceInicial); Parâmetro : IndiceInicial, que é o ponto no qual a substring se inicia dentro da string. Retorna : uma substring que se inicia em IndiceInicial e vai até o final da string. 66 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO O índice de uma string sempre se inicia com o valor zero. Assim, uma string de 10 caracteres possui o índice variando de zero a nove. public string Substring(int IndiceInicial, int tamanho); Parâmetros : IndiceInicial, que é o ponto no qual a substring se inicia dentro da string. tamanho: o número de caracteres da substring. String frase = “Esta e uma string”; int IndiceInicial = 5; String substring1 = frase.Substring(IndiceInicial); Console.WriteLine(substring1); int tamanho = 4; String substring2 = frase.Substring(IndiceInicial, tamanho); Console.WriteLine(substring2); Saída: 4.1.8 INDEXOF IndexOf é utilizado para comparação de strings. Retorna a posição de uma substring dentro da string que se quer comparar. public int IndexOf(string value, int startIndex, int count); Parâmetros : valor, que é a string que se deseja procurar, IndiceInicial : posição inicial da string para a busca, 67 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO tamanho : o número de caracteres que se deseja examinar. O exemplo abaixo procura a string “maior” dentro da string frase, a partir da posição 0 (zero – início da string) até o final (tamanho = tamanho da string – 1) String frase = “Esta e uma string maior ainda para teste”; int tamanho = frase.Length - 1; int IndiceInicial = 0; string valor = “maior”; int posicao = frase.IndexOf(valor, IndiceInicial,tamanho); Console.WriteLine(posicao); Uma versão mais simples para se obter o mesmo resultado : public int IndexOf(string value) Parâmetros : valor, que é a string que se deseja procurar. String frase = “Esta e uma string maior ainda para teste”; string valor = “maior”; int posicao = frase.IndexOf(valor); Console.WriteLine(posicao); Sempre consulte a documentação da Microsoft para saber as diversas formas de declaração de métodos. 68 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 4.1.9 CONCATENAÇÃO DE STRINGS Você pode utilizar + ou += para concatenar strings. string usuario = “Maria da Silva”; string dataString = DateTime.Today.ToShortDateString(); // utilize + ou += para concatenações string str = “Ola “ + usuario + “. hoje é “ + dataString + “.”; System.Console.WriteLine(str); Saída: 4.1.10 STRINGBUILDER() Existem casos que você pode combinar cadeias de caracteres em um loop em que você não sabe quantas cadeias de caracteres de origem você está combinando, sen- do que o número real de cadeias de caracteres de origem pode ser grande demais. A classe StringBuilder foi projetada para esses cenários. O exemplo abaixo utiliza o método Append para adicionar concatenar strings : var sb = new System.Text.StringBuilder(); for (int i = 0; i < 13; i++) { sb.Append(i.ToString()); } System.Console.WriteLine(sb.ToString()); 69 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO Saída: Você pode usar String.Concat para unir uma cadeia de caracteres e String.Join para unir cadeia de caracteres separadas por um delimitador : string[] palavras = { “A”, “rapida”, “raposa”, “marrom”, “pula”, “sobre”, “o”, “cachorro”, “pre- guicoso.” }; var fraseIlegivel = string.Concat(palavras); System.Console.WriteLine(fraseIlegivel); var fraseLegivel = string.Join(“ “, palavras); System.Console.WriteLine(fraseLegivel); Saída : 4.1.11 SPLIT O método Split é super divide uma cadeia de caractereis baseado em um ou dois delimitadores. Muito usado para tratar mensagens de webservices (veremos mais adiante no nível avançado). 70 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO var fraseLegivel = “A rapida raposa marrom pula sobre o cachorro preguicoso.”; string[] palavras = fraseLegivel.Split(‘ ‘); foreach (var palavra in palavras) { System.Console.WriteLine($”{palavra}”); } Saída : 4.1.12 PESQUISA EM CADEIA DE CARACTERES O tipo string, da classe String, implementa uma série de métodos úteis para pesquisa em cadeia de caracteres.Os métodos String.Contains, StringStartsWith e EndsWith são métodos avançados de pesquisa em cadeis de caracteres. var fraseLegivel = “A rapida raposa marrom pula sobre o cachorro preguicoso.”; // Escreve string e inclui aspas. Console.WriteLine($”\”{fraseLegivel}\””); 71 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO // Comparação simples case sensitive bool resultado = fraseLegivel.Contains(“marrom”); Console.WriteLine($”Contem \”marrom\”? {resultado}”); // Para entrada de dados e string que serão exibidas para o usuario // utilize StringComparison bool ignoraCase = fraseLegivel.StartsWith(“marrom”, System.StringComparison.Cur- rentCultureIgnoreCase); Console.WriteLine($”Inicia com \”marrom\”? {ignoraCase} (ignorando case)”); bool terminaCom = fraseLegivel.EndsWith(“.”, System.StringComparison.CurrentCul- tureIgnoreCase); Console.WriteLine($”Termina com ‘.’? {terminaCom}”); Saída: 4.1.13 VERIFICANDO PADRÕES COM EXPRESSÕES REGULARES Existem certas situações nas quais você precisa verificar se uma cadeia de caracteres é escrita num determinado padrão. Isto pode ocorrer para verificar formato de telefo- nes, CPF e CNPJ, por exemplo. Para isto usamos expressões regulares. 72 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO O exemplo a seguir verifica na matriz de códigos se cada código obedece ao padrão “###-###-####” : string[] codigos = { “123-555-0190”, “444-234-22450”, “690-555-0178”, “146-893-232”, “146-555-0122”, “4007-555-0111”, “407-555-0111”, “407-2-5555”, “407-555-8974”, “407-2ab-5555”, “690-555-8148”, “146-893-232-” }; string sPadrao = “^\\d{3}-\\d{3}-\\d{4}$”; // \d verifica se é digito decimal foreach (string s in codigos) { Console.Write($”{s,14}”); 73 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO if (System.Text.RegularExpressions.Regex.IsMatch(s, sPadrao)) { Console.WriteLine(“ - valido”); } else { Console.WriteLine(“ - invalido”); } } } } Saída: 74 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 4.1.14 VERIFICANDO SE UMA CADEIA DE CARACTERES REPRESENTA UM NÚMERO Para verificar se uma cadeia de caracteres representa um número, você deve utilizar o método estático TryParse : string numString = “1287543”; long numero1 = 0; bool podeConverter = long.TryParse(numString, out numero1); if (podeConverter == true) Console.WriteLine(“numero1 = {0}”, numero1); else Console.WriteLine(“numString nao e um longo valido”); byte numero2 = 0; string numString = “255”; podeConverter = byte.TryParse(numString, out numero2); if (podeConverter == true) Console.WriteLine(“numero2 = {0}”, numero2); else Console.WriteLine(“numString nao e um byte valido”); 75 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO decimal numero3 = 0; numString = “27.3”; podeConverter = decimal.TryParse(numString, out numero3); if (podeConverter == true) Console.WriteLine(“numero3 = {0}”, numero3); else Console.WriteLine(“number3 nao e um decimal valido”); Saída : 4.2 PALAVRAS RESERVADAS Palavras reservadas são aquelas que já são reservadas para a linguagem e possuem um significado específico para o compilador. Elas não podem ser usadas no seu pro- grama a não ser que você utilize @ como prefixo. Por exemplo, se você utilizar if como o nome de uma variável , vai dar erro. Mas se você utilizar @if não tem problema. A tabela a seguir mostra as palavras reservadas para qualquer programa C# : abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false 76 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using using static virtual void volatile while 4.2.1 PALAVRAS-CHAVE CONTEXTUAIS Palavras-chave contextuais são utilizadas para se obter um significado específico no código, porém, não são palavras reservadas do C#. add alias ascending async await descending dynamic from get global group into join let nameof orderby parcial (tipo) partial (método) remove select set value var when (condição de filtro) where (restrição de tipo genérico) where (cláusula de consulta) yield 77 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO CONCLUSÃO Aprendemos nesta unidade as principais técnicas de manipulação de string. Estas que foram apresentadas são suficientes para pensarmos no desenvolvimento de nos- so webservice. Aprendemos também as palavras reservadas que não podemos utilizar em nosso código fonte. 78 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO OBJETIVO Ao final desta unidade, esperamos que possa: > Escolher delegates para usar no desenvolvimento de seus aplicativos; > Usar o tratamento de exceções em seu código para aumentar a qualidade do aplicativo produzido UNIDADE 5 79 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 PROGRAMAÇÃO ORIENTADA A OBJETOS I SUMÁRIO 5 PROGRAMAÇÃO C# - NÍVEL AVANÇADO Nesta unidade abordaremos 2 dos assuntos mais complexos do C# : delegates e tra- tamento de exceções. Delegates servem para funções que recebem funções como parâmetros. É um recur- so excelente para reaproveitamento de código e para flexibilizar seus métodos. Tratamento de exceções serve para controlar o fluxo de erros do seu aplicativo. 5.1 DELEGADOS ( DELEGATES) Se você pesquisar na literatura disponível, vai encontrar a definição de delegates como um ponteiro fortemente tipado para uma função. A declaração de um delegate é : <modificador de acesso> delegate <tipo que ele vai retornar> <nome do delegate> ( <parâmetros >); O método que vai ser delegado tem que ter a mesma declaração no que se refere a o que ele vai retornar e parâmetros : <modificador de acesso> <retorno igual de delegate> <nome do método> (<parâme- tros iguais ao do delegate>) Exemplo Básico : Suponhamos que o seguinte método é o método que var ser delegado : public static void meuMetodo() { Console.WriteLine(“Escrevendo mensagem”); } 80 PROGRAMAÇÃO ORIENTADA A OBJETOS I FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO É um método simples, que somente escreve uma frase na console. Para delegar este método, temos que ter um delegate com a declaração conforme descrita acima : public delegate void meuDelegate() ; Note que o tipo do delegate é o mesmo tipo
Compartilhar