k19-k31-csharp-e-orientacao-a-objetos

download k19-k31-csharp-e-orientacao-a-objetos

of 139

Transcript of k19-k31-csharp-e-orientacao-a-objetos

TREINAMENTOS

C# e Orientao a Objetos

C# e Orientao a Objetos

31 de maio de 2011

www.k19.com.br

ii

Sumrio1 2 Introduo Lgica de Programao 2.1 O que um Programa? . . . . . . . . . . . . . . . . . . 2.2 Linguagem de Programao VS Linguagem de Mquina 2.3 Exemplo de programa C# . . . . . . . . . . . . . . . . . 2.4 Mtodo Main - Ponto de Entrada . . . . . . . . . . . . . 2.5 Mquinas Virtuais . . . . . . . . . . . . . . . . . . . . . 2.6 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . 2.7 Operadores . . . . . . . . . . . . . . . . . . . . . . . . 2.8 Controle de Fluxo: IF-ELSE . . . . . . . . . . . . . . . 2.9 Controle de Fluxo: WHILE . . . . . . . . . . . . . . . . 2.10 Controle de Fluxo: FOR . . . . . . . . . . . . . . . . . 2.11 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . Orientao a Objetos 3.1 Objetos . . . . . . . . . . . . . . . . . . . . 3.2 Classes . . . . . . . . . . . . . . . . . . . . 3.3 Referncias . . . . . . . . . . . . . . . . . . 3.4 Manipulando Atributos . . . . . . . . . . . . 3.5 Agregao . . . . . . . . . . . . . . . . . . . 3.6 Exerccios . . . . . . . . . . . . . . . . . . . 3.7 Mtodos . . . . . . . . . . . . . . . . . . . . 3.8 Sobrecarga(Overloading) . . . . . . . . . . . 3.9 Exerccios . . . . . . . . . . . . . . . . . . . 3.10 Construtores . . . . . . . . . . . . . . . . . . 3.10.1 Construtor Default . . . . . . . . . . 3.10.2 Sobrecarga de Construtores . . . . . 3.10.3 Construtores chamando Construtores 3.11 Exerccios . . . . . . . . . . . . . . . . . . . 3.12 Referncias como parmetro . . . . . . . . . 3.13 Exerccios . . . . . . . . . . . . . . . . . . . 1 3 3 3 4 5 6 10 12 13 14 14 15 17 17 18 19 20 21 22 26 28 29 31 32 33 34 34 37 37

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

3

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

4

Arrays 39 4.1 Arrays Multidimensionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 4.2 Arrays de Arrays - Jagged Arrays . . . . . . . . . . . . . . . . . . . . . . . . 40 iii

SUMRIO 4.3 4.4 4.5 5

SUMRIO

Percorrendo Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Operaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

IDE - Integrated Development Environment 45 5.1 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Atributos e Mtodos de Classe 49 6.1 Atributos Estticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 6.2 Mtodos Estticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 6.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Encapsulamento 7.1 Atributos Privados . . . . . . . . 7.2 Mtodos Privados . . . . . . . . . 7.3 Mtodos Pblicos . . . . . . . . . 7.4 Implementao e Interface de Uso 7.5 Escondendo a implementao . . . 7.6 Acesso e Alterao de atributos . . 7.7 Propriedades . . . . . . . . . . . 7.8 Exerccios . . . . . . . . . . . . . Herana 8.1 Reutilizao de Cdigo 8.2 Reescrita de Mtodo . 8.3 Construtores e Herana 8.4 Exerccios . . . . . . . 55 55 56 56 57 57 59 60 60 63 63 67 69 70 75 76 77 77 78

6

7

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

8

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

9

Polimorsmo 9.1 Modelagem das contas . . . . . 9.2 UM (:) . . . . . . . . . . . . . 9.3 Melhorando o gerador de extrato 9.4 Exerccios . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

10 Classes Abstratas 81 10.1 Classes Abstratas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 10.2 Mtodos Abstratos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 10.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 11 Interfaces 11.1 Padronizao . . . 11.2 Contratos . . . . . 11.3 Exemplo . . . . . . 11.4 Polimorsmo . . . 11.5 Interface e Herana 11.6 Exerccios . . . . . www.k19.com.br 87 87 88 88 89 90 92 iv

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

SUMRIO 12 Namespace 12.1 Organizao . . . . . . . . . . 12.2 O comando namespace . . . . 12.3 Namespaces Encadeados . . . 12.4 Namespace global . . . . . . . 12.5 Classes ou Interfaces pblicas 12.5.1 Fully Qualied Name . 12.6 Using . . . . . . . . . . . . . 12.7 Nveis de visibilidade . . . . . 12.7.1 Privado . . . . . . . . 12.7.2 Interno . . . . . . . . 12.7.3 Protegido . . . . . . . 12.7.4 Pblico . . . . . . . . 12.7.5 Protegido Interno . . . 12.8 Exerccios . . . . . . . . . . .

SUMRIO 95 95 95 95 96 96 96 98 98 98 98 98 99 99 99 101 102 102 102 103 103 104 107 107 108 109 110 113 113 114 114 117 117 118 118 118 118 119 119 119 120 120 120

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

13 Exceptions 13.1 Tipos de erros de execuo . . . . 13.2 Lanando erros . . . . . . . . . . 13.3 Capturando erros . . . . . . . . . 13.4 nally . . . . . . . . . . . . . . . 13.5 Denindo Exceptions Especcas . 13.6 Exerccios . . . . . . . . . . . . . 14 A classe Object 14.1 Polimorsmo . . . 14.2 O mtodo ToString 14.3 O mtodo Equals . 14.4 Exerccios . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

15 Entrada e Sada 15.1 Leitura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.2 Escrita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Collections 16.1 Listas . . . . . . . . . . . . . . . 16.1.1 Mtodo: Add(object) . . . 16.1.2 Mtodo: Insert(int, object) 16.1.3 Propriedade: Count . . . . 16.1.4 Mtodo: Clear() . . . . . 16.1.5 Mtodo: Contains(object) 16.1.6 Mtodo: Remove(object) . 16.1.7 Mtodo: RemoveAt(int) . 16.1.8 Propriedade: Item . . . . 16.1.9 Mtodo: IndexOf(object) . 16.2 Exerccios . . . . . . . . . . . . . v

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

K19 Treinamentos

SUMRIO 16.3 Generics . . . . . . . . 16.3.1 Benchmarking 16.4 Exerccios . . . . . . . 16.5 Conjuntos . . . . . . . 16.6 Colees . . . . . . . . 16.7 Lao foreach . . . . . 16.8 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

SUMRIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 123 123 125 126 126 127

17 Apndice - Recursos Avanados da Linguagem 129 17.1 Indexers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 17.2 Sobrecarga de Operador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 17.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

www.k19.com.br

vi

Captulo 1 IntroduoO principal objetivo deste treinamento capacitar prossionais para atuar no mercado de trabalho na rea de desenvolvimento de software. Conhecimentos sobre C# e sobre o modelo de programao orientado a objetos so normalmente exigidos pelas empresas que desejam contratar. Portanto, os dois tpicos principais deste treinamento so: C# e orientao a objetos. Resumidamente, apresentaremos a seguir cada um desses assuntos e as relaes entre eles. Orientao a objetos um modelo de programao ou paradigma de programao, ou seja, um conjunto de ideias, conceitos e abstraes que servem como um guia para construir um software. A linguagem de programao utilizada para denir formalmente todas as partes de um sistema e como essas partes se relacionam. Alm disso, a linguagem de programao C# orientada a objetos, ou seja, ela permite que voc aplique as ideias, conceitos e abstraes de orientao a objetos de uma maneira natural. O ambiente de execuo composto basicamente de uma mquina virtual e de um conjunto de bibliotecas padronizado. A mquina virtual permite que um programa C# possa ser executado em ambiente diferentes. As bibliotecas facilitam a implementao dos sistemas. O processo de desenvolver um sistema orientado a objetos em C# se d da seguinte forma: As partes do sistema e o relacionamento entre elas so denidas utilizando o modelo de programao orientado a objetos e depois o cdigo fonte do sistema escrito na linguagem de programao C#. Do ponto de vista do aprendizado, interessante tentar denir o grau de importncia dos dois assuntos principais abordados neste treinamento. Consideramos que a orientao a objetos mais importante pois ela utilizada frequentemente no desenvolvimento de software inclusive com outras linguagens de programao (Java, JavaScript, Ruby, C++, entre outras). As pessoas que possuem conhecimentos mais slidos em orientao a objetos so mais preparadas para desenvolver sistemas na maioria das linguagens utilizadas pelas empresas que desenvolvem software. Para compreender melhor o contedo desse treinamento, importante saber para quais tipos de sistemas o modelo de programao orientado a objetos e a linguagem C# so mais adequados. As caractersticas desses sistemas so: Possui uma grande quantidade de funcionalidades, sendo necessria uma equipe de desenvolvedores para desenvolver e manter o funcionamento do sistema. Ser utilizado por muito tempo e sofrer alteraes com o tempo. 1

Introduo Esse tipo de sistema justamente o que muitas empresas que desenvolvem software esto interessadas em desenvolver. Por isso, elas acabam adotando orientao a objetos e C#. Para que sistemas desse tipo sejam bem sucedidos algumas qualidades so necessrias. Durante o treinamento, discutiremos quais so essas qualidades e como consegui-las.

www.k19.com.br

2

Captulo 2 Lgica de Programao2.1 O que um Programa?

Quando as apuraes dos votos das eleies eram realizadas manualmente, o tempo para obter os resultados e chance de ocorrer uma falha humana eram grandes. Esse processo foi automatizado e hoje realizado por computadores. O tempo para obter os resultados e a chance de ocorrer uma falha humana diminuram bastante. Os computadores so capazes de executar instrues. Com essa capacidade eles podem resolver tarefas complexas. Porm, eles no so sucientemente inteligentes para denir quais instrues devem ser executadas para resolver uma determinada tarefa. Em outras palavras, um computador sabe executar comandos mas no sabe quais comandos devem ser executados para solucionar um problema. Ento, uma pessoa precisa criar um roteiro com as instrues que devem ser executadas pelo computador para que uma determinada tarefa seja realizada. Esses roteiros devem ser colocados em arquivos no disco rgido dos computadores. Assim, quando as tarefas precisam ser realizadas, os computadores podem ler esses arquivos para saber quais instrues devem ser executadas. Um arquivo contendo um roteiro de instrues que devem ser relizadas por um computador para resolver uma determinada tarefa chamado de programa ou executvel. As pessoas que criam programas so chamadas de programadores.

2.2

Linguagem de Programao VS Linguagem de Mquina

Os computadores s sabem ler programas escritos em Liguagem de Mquina. Um programa escrito em Liguagem de Mquina uma sequncia de nmeros que representam as instrues que um computador deve executar.

Teoricamente, os programadores poderiam escrever os programas j em Linguagem de Mquina. Na prtica, ningum faz isso pois uma tarefa muito complicada e demorada. muito 3

Lgica de Programao complicado para uma pessoa ler um programa escrito em Linguagem de Mquina. Ao invs disso, os programadores escrevem os programas utilizando alguma Linguagem de Programao. As Linguagens de Programao tentam ser mais prximas das linguagens humanas. Para uma pessoa, mais fcil ler um programa escrito em Linguagem de Programao. Os programas escritos pelos programadores em alguma Linguagem de Programao so traduzidos para programas escritos em Linguagem de Mquina para que os computadores possam execut-los. Quem faz essa traduo so os compiladores. Os programas escritos em Linguagem de Programao so chamados de Cdigo Fonte. Os programas escritos em Linguagem de Mquina so chamados de Cdigo Executvel ou simplesmente Executvel.

2.3

Exemplo de programa C#

Uma Linguagem de Programao muito utilizada no mercado de trabalho a linguagem C#. Os cdigos dos programas escritos em C# so colocados em arquivos com a extenso .cs. Observe o cdigo do exemplo de programa escrito em C# que imprime uma mensagem na tela.

1 2 3 4 5 6 7 8

// arquivo: OlaMundo.cs class OlaMundo { static void Main() { System.Console.WriteLine("Ol Mundo"); } }

Agora, no necessrio entender todo esse cdigo fonte. O importante saber que todo programa escrito em C# para executar precisa ter o mtodo especial Main. Esse cdigo fonte precisa ser traduzido para um executvel para que um computador possa execut-lo. Essa traduo realizada por um compilador da linguagem C#. Suponha que o cdigo acima seja colocado no arquivo OlaMundo.cs. O compilador padro de C# (csc) pode ser utilizado para compilar esse arquivo. O Command Prompt permite que o compilador seja executado. www.k19.com.br 4

Lgica de Programao

O executvel gerador pelo compilador csc colocado em um arquivo chamado OlaMundo.exe que podemos executar pelo Command Prompt.

2.4

Mtodo Main - Ponto de Entrada

Para um executvel C# executar, necessrio denir um mtodo especial para ser o ponto de entrada do programa, ou seja, para ser o primeiro mtodo a ser chamado quando o programa 5 K19 Treinamentos

Lgica de Programao for executado. O mtodo Main precisa ser static e seu tipo de retorno pode ser void ou int. Ele tambm pode declarar parmentros para receber os argumentos passados pela linha de comando e deve ser inserido em uma classe C#. Algumas verses do mtodo Main:1 2 3 4 static static static static void Main() int Main() void Main(string[] args) void Main(string[] args)

Os parmetros do mtodo Main so passados pela linha de comando e podem ser manipulados dentro do programa. O cdigo abaixo imprime cada parmetro recebido em uma linha diferente. A execuo do programa mostrada na gura abaixo.1 2 3 4 5 6 7 8 9 10 11 // arquivo: OlaMundo.cs class OlaMundo { static void Main(string[] args) { for(int i = 0; i < args.Length; i++) { System.Console.WriteLine(args[i]); } } }

2.5

Mquinas Virtuais

Os compiladores geram executveis especcos para um determinado tipo de processador e um Sistema Operacional. Em outras palavras, esses executveis funcionam corretamente em computadores que possuem um determinado tipo de processador e um determinado Sistema Operacional. www.k19.com.br 6

Lgica de Programao

Como os computadores possuem processadores de tipos diferentes e Sistemas Operacionais diferentes, necessrio ter diversos executveis do mesmo programa para poder execut-lo em computadores diferentes.

Do ponto de vista de uma empresa que vende software, manter atualizados e distribuir corretamente os diversos executveis de um mesmo programa custoso. Alm disso, ao escrever um programa, os programadores utilizam bibliotecas que j realizam parte do trabalho que deveria ser feito. Essas bibliotecas so chamadas diretamente do cdigo fonte e elas s funcionam em um determinado Sistema Operacional e em um tipo especco de processador. Dessa forma, o cdigo fonte de um programa ca acoplado a um determinado tipo de processador e um determinado Sistema Operacional.

No basta manter diversos executveis de um mesmo programa. necessrio ter diversos cdigos fonte de um mesmo programa, um para cada tipo de processador e Sistema Operacional 7 K19 Treinamentos

Lgica de Programao que sero utilizados. O alto custo de desenvolvimento e manuteno desses cdigos fonte pode tornar invivel para a empresa a comercializao de um determinado software.

Para no ser necessrio manter diversos executveis e diversos cdigos fonte de um mesmo programa, surgiu o conceito de Mquina Virtual.

Uma Mquina Virtual um programa que funciona como um computador, ela sabe ler e executar instrues de programas escritos na sua prpria Linguagem de Mquina. Alm disso, as Mquinas Virtuais oferecem bibliotecas para criao de programas.

Para ser vantajoso, necessrio ter diversas implementaes da mesma Mquina Virtual. Cada implementao deve funcionar em um Sistema Operacional e em um tipo de processador.

Dessa forma, um programador pode escrever o cdigo fonte de um programa chamando diretamene as bibliotecas da Mquina Virtual. Depois, compilar esse cdigo fonte para gerar um executvel escrito na Linguagem de Mquina da Mquina Virtual. www.k19.com.br 8

Lgica de Programao

O benefcio da utilizao de Mquinas Virtuais o ganho de portabilidade. Em outras palavras, para executar um programa em computadores diferentes, necessrio apenas um cdigo fonte e um executvel. A desvantagem de utilizar uma Mquina Virtual para executar um programa e a diminuio de performance j que a prpria Mquina Virtual consome recursos do computador. Alm disso, as instrues do programa so processadas primeiro pela Mquina Virtual e depois pelo computador. Por outro lado, as Mquinas Virtuais podem aplicar otimizaes que aumentam a performance da execuo de um programa. Inclusive, essas otimizaes podem considerar informaes geradas durante a execuo. So exemplos de informaes geradas durante a execuo: a quantidade de uso da memria RAM e do processador do computador, a quantidade de acessos ao disco rgido, a quantidade de chamadas de rede e a frequncia de execuo de um determinado trecho do programa. Algumas Mquinas Virtuais identicam os trechos do programa que esto sendo mais executados em um determinado momento da execuo para traduz-los para a Linguagem de Mquina do computador. A partir disso, esses trechos podem ser executador diretamente no computador sem passar pela Mquina Virtual. Essa anlise da Mquina Virtual realizada durante toda a execuo. Com essas otimizaes que consideram vrias informaes geradas durante a execuo, um programa executado com Mquina Virtual pode at ser mais eciente em alguns casos do que um programa executado sem Mquina Virtual. Os executveis gerados pelo compilador padro da linguagem C# so executados em Mquina Virtual. 9 K19 Treinamentos

Lgica de Programao

2.6

Variveis

Um dos recursos fundamentais que a maioria das Linguagens de Programao oferece o de criao e utilizao de variveis. A funo de uma varivel permitir que um programa armazene e manipule dados na memria RAM do computador.

DeclaraoNa Linguagem de Programao como C#, as variveis devem ser declaradas para que possam ser utilizadas. A declarao de uma varivel envolve denir um nome nico e um tipo de valor. As variveis so acessadas pelos nomes e armazenam valores compatveis com o seu tipo.1 2 3 4 5 // tipo: int, nome: numero int numero; // tipo: double, nome: preco double preco;

Declarao, Inicializao e UsoToda varivel deve ser inicializada antes de ser utilizada pela primeira vez. Se isso no for realizado ocorrer um erro de compilao. A inicializao realizada atravs do operador de atribuio =. Esse operador guarda um valor na varivel, ou melhor, no espao de memria reservado para a varivel.1 2 3 4 5 6 7 8 9 10 11 // Declaracao int numero; double preco; // Inicializacao numero = 10; // Uso System.Console.WriteLine(numero); // Erro de compilacao System.Console.WriteLine(preco);

Mais DeclaraesA declarao de uma varivel pode ser feita em qualquer linha de um bloco. No necessrio declarar todas as variveis no comeo do bloco. www.k19.com.br 10

Lgica de Programao1 2 3 4 5 6 7 8 9 10 11 // Declaracao e Inicializacao int numero = 10; // Uso System.Console.WriteLine(numero); // Outra Declaracao e Inicializacao double preco = 137.6; // Uso System.Console.WriteLine(preco);

EscopoToda varivel pode ser utilizada dentro do bloco no qual ela foi declarada aps a linha da sua inicializao.1 2 3 4 5 // Aqui nao pode usar o numero int numero = 10; // Aqui pode usar numero System.Console.WriteLine(numero);

No permitido declarar duas variveis com o mesmo nome dentro de um mesmo bloco. Se isso ocorrer o compilador indicar um erro de compilao.1 2 3 int numero = 10; // Erro de compilacao int numero = 5;

Dentro de um bloco possvel abrir um sub-bloco. As variveis declaradas antes do subbloco podem ser acessadas tambm no sub-bloco. Assuma que o cdigo abaixo est dentro do bloco do mtodo Main.1 2 3 4 5 6 7 8 9 10 int numero = 10; // sub-bloco do bloco do Main { // Aqui pode usar o numero System.Console.WriteLine(numero); } // Aqui tambem pode usar o numero System.Console.WriteLine(numero);

Porm, variveis declaradas em sub-blocos no podem ser acessadas do bloco pai nem de outro sub-bloco do bloco pai. 11 K19 Treinamentos

Lgica de Programao1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // sub-bloco do bloco do Main { int numero = 10; // Aqui pode usar o numero System.Console.WriteLine(numero); } // Erro de compilacao System.Console.WriteLine(numero); // sub-bloco do bloco do Main { // Erro de compilacao System.Console.WriteLine(numero); }

Dentro de sub-blocos diferentes de um mesmo bloco permitido declarar variveis com nomes iguais.1 2 3 4 5 6 7 8 9 // sub-bloco do bloco do Main { int numero = 10; } // outro sub-bloco do bloco do Main { int numero = 10; }

2.7

Operadores

Para manipular os valores das variveis, podemos aplicar os operadores da linguagem. H diversos tipos de operadores.

AritmticosPara realizar as operaes matemticas podemos aplicar os operadores: +(soma), -(subtrao), *(multiplicao), /(diviso) e % (modlo).1 2 3 4 5 int int int int int dois = 1 + 1; tres = 4 - 1; quatro = 2 * 2; cinco = 10 / 2; um = 5 % 2;

Igualdade e DesigualdadePara vericar se o valor armazenado em uma varivel igual ou diferente a um determinado valor ou ao valor de outra varivel, devem ser utilizados os operadores: ==(igual) e !=(diferente). Esses operadores devolvem valores do tipo bool(true ou false). www.k19.com.br 12

Lgica de Programao1 2 3 4 5 6 7 8 9 int numero = 10; bool teste1 = numero == 10; bool teste2 = numero != 10; // imprime: True System.Console.WriteLine(teste1); // imprime: False System.Console.WriteLine(teste2);

RelacionaisAs variveis nmericas podem ser comparadas com o intuito de descobrir a ordem ou a relao nmerica dos seus valores. Os operadores relacionais so: >, = e 5; < 5; >= 10; 1 && numero2 < 10; numero1 > 1 || numero2 < 10;

// imprime: False System.Console.WriteLine(teste1); // imprime: True System.Console.WriteLine(teste2);

2.8

Controle de Fluxo: IF-ELSE

Muitas vezes os programadores necessitam denir quais trechos de cdigo devem ser executados de acordo com uma ou mais condies. Por exemplo, quando o pagamento de um boleto feito em alguma agncia, o sistema do banco deve vericar a data de vencimento do boleto para aplicar a multa por atraso ou no. 13 K19 Treinamentos

Lgica de Programao1 2 3 4 5 6 7 8 9 10 11 DateTime vencimento = DateTime.Parse("01/09/2009"); DateTime hoje = DateTime.Now; if (hoje > vencimento) { System.Console.WriteLine("Calcula multa"); } else { System.Console.WriteLine("Sem multa"); }

O comando if permite que valores booleanos sejam testados. Se o valor passado como parmetro para o comando if for True o bloco do if executado caso contrrio o bloco do else executado. O parmetro passado para o comando if deve ser um valor booleano, caso contrrio o cdigo fonte no compilar. O comando else e o seu bloco so opcionais.

2.9

Controle de Fluxo: WHILE

Em alguns casos, necessrio repetir um trecho de cdigo diversas vezes. Suponha que seja necessrio imprimir 10 vezes na tela a mensagem: Bom Dia. Isso poderia ser realizado colocando no cdigo fonte 10 linhas iguais. Porm, se ao invs de 10 vezes fosse necessrio imprimir 100 vezes j seriam 100 linhas iguais no cdigo fonte. Atravs do comando while, possvel denir quantas vezes um determinado trecho de cdigo deve ser executado pelo computador.1 2 3 4 5 6 7 int contador = 0; while(contador 0) { this.saldo += valor; return true; } else { return false; } }

Ao chamar o mtodo D EPOSITA () a resposta pode ser armazenada em uma varivel. 27 K19 Treinamentos

Orientao a Objetos1 2 3 4 5 6 7 8 9 10 11 Conta c = new Conta(); bool reposta = c.Deposita(1000); if(resposta) { System.Console.WriteLine("O depsito foi efetuado"); } else { System.Console.WriteLine("O depsito no foi efetuado"); }

3.8

Sobrecarga(Overloading)

natural que um cliente do banco queira consultar periodicamente algumas informaes das suas contas. Para obter essas informaes o cliente pode pedir um extrato. Como dados das contas devem ser utilizados para gerar os extratos, interessante denir um mtodo na classe C ONTA para implementar a lgica para imprimir extratos.1 2 3 4 5 6 7 8 9 10 11 class Conta { public double saldo; public double limite; public void ImprimeExtrato() { System.Console.WriteLine("Saldo: " + this.saldo); System.Console.WriteLine("Limite: " + this.limite); } }

Normalmente, quando requisitamos extratos para os bancos, temos a possibilidade de passar uma quantidade de dias que devem ser considerados ou utilizar a quantidade padro denida pelo banco (ex: 15 dias). Para implementar essas possibilidades, podemos denir dois mtodos na classe C ONTA.1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Conta { public void ImprimeExtrato() { // Logica para gerar um extrato dos ultimos 15 dias } public void ImprimeExtrato(int dias) { // Logica para gerar um extrato com // uma quantidade variavel de dias } }

O primeiro mtodo no recebe parmetros pois ele utilizar uma quantidade de dias padro pelo banco para gerar os extratos. O segundo recebe um valor inteiro como parmetro e deve considerar essa quantidade de dias para gerar os extratos. Os dois mtodos possuem o mesmo nome e lista de parmetros diferentes. Quando dois ou mais mtodos so denidos na mesma www.k19.com.br 28

Orientao a Objetos classe com o mesmo nome, dizemos que houve uma sobrecarga de mtodos. Uma sobrecarga de mtodos s vlida se as listas de parmetros dos mtodos so diferentes entre si. No caso dos dois mtodos que geram extratos, poderamos evitar repetio de cdigo fazendo um mtodo chamar o outro. Normalmente, o mtodo mais especco chama o mtodo mais genrico.1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Conta { public void ImprimeExtrato() { this.ImprimeExtrato(15); } public void ImprimeExtrato(int dias) { // Logica para gerar um extrato com // uma quantidade variavel de dias } }

3.9

Exerccios

13. Acrescente alguns mtodos na classe C ONTA para denir as lgicas de depositar, sacar e imprimir extrato.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

// arquivo: Conta.cs class Conta { public double saldo; public Agencia agencia; public void Deposita(double valor) { this.saldo += valor; } public void Saca(double valor) { this.saldo -= valor; } public void ImprimeExtrato() { System.Console.WriteLine("SALDO: " + this.saldo); } }

14. Teste os mtodos da classe C ONTA. 29 K19 Treinamentos

Orientao a Objetos1 2 3 4 5 6 7 8 9 10 11 12 13 14 // arquivo: TestaMetodosConta.cs class TestaMetodosConta { static void Main() { Conta c = new Conta(); c.Deposita(1000); c.ImprimeExtrato(); c.Saca(100); c.ImprimeExtrato(); } }

Compile e execute a classe T ESTA M ETODOS C ONTA. 15. Crie uma classe para modelar as faturas dos cartes de crdito.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

// arquivo: Fatura.cs class Fatura { public double total; public void Adiciona(double valor) { this.total += valor; } public double CalculaMulta() { return this.total * 0.2; } public void ImprimeDados() { System.Console.WriteLine("Total: " + this.total); } }

16. Teste a classe FATURA.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // arquivo: TestaMetodosFatura.cs class TestaMetodosFatura { static void Main() { Fatura f = new Fatura(); f.Adiciona(100); f.Adiciona(200); f.ImprimeDados(); double multa = f.CalculaMulta(); System.Console.WriteLine(multa); } }

www.k19.com.br

30

Orientao a Objetos Compile e execute a classe T ESTA M ETODOS FATURA.

3.10

Construtores

Na criao de um carto de crdito fundamental que o nmero dele seja denido. Na criao de uma agncia necessrio que o nmero dela seja escolhido. Uma conta quando criada deve ser associada a uma agncia. Aps criar um objeto para representar um carto de crdito, poderamos denir um valor para o atributo NUMERO. De maneira semelhante, podemos denir um nmero para um objeto da classe AGENCIA e uma agncia para um objeto da classe C ONTA.1 2 CartaoDeCredito cdc = new CartaoDeCredito(); cdc.numero = 12345;

1 2

Agencia a = new Agencia(); a.numero = 11111;

1 2

Conta c = new Conta(); c.agencia = a;

Denir os valores dos atributos obrigatrios de um objeto logo aps a criao dele resolveria as restries do sistema do banco. Porm, nada garante que todos os desenvolvedores sempre lembrem de inicializar esses valores. Para resolver esse problema, podemos utilizar o conceito de CONSTRUTOR que permite que um determinado trecho de cdigo seja executado toda vez que um objeto criado. Um construtor pode receber parmetros como os mtodos mas no pode devolver uma resposta. Alm disso, em C#, para denir um construtor devemos utilizar o mesmo nome da classe na qual o construtor foi colocado.1 2 3 4 5 6 7 8 9 10 // arquivo: CartaoDeCredito.cs class CartaoDeCredito { public int numero; public CartaoDeCredito(int numero) { this.numero = numero; } }

31

K19 Treinamentos

Orientao a Objetos1 2 3 4 5 6 7 8 9 10 // arquivo: Agencia.cs class Agencia { public int numero; public Agencia(int numero) { this.numero = numero; } }

1 2 3 4 5 6 7 8 9 10

// arquivo: Conta.cs class Conta { public Agencia agencia; public Conta(Agencia agencia) { this.agencia = agencia; } }

Na criao de um objeto com o comando NEW, os argumentos passados devem ser compatveis com a lista de parmetro de algum construtor denido na classe que est sendo instanciada. Caso contrrio, um erro de compilao ocorrer para avisar o desenvolvedor dos valores obrigatrios que devem ser passados para criar um objeto.1 2 3 4 5 6 // Passando corretamente os parmetros para os construtores CartaoDeCredito cdc = new CartaoDeCredito(1111); Agencia a = new Agencia(1234); Conta c = new Conta(a);

1 2 3 4 5 6 7 8

// ERRO DE COMPILACAO CartaoDeCredito cdc = new CartaoDeCredito(); // ERRO DE COMPILACAO Agencia a = new Agencia(); // ERRO DE COMPILACAO Conta c = new Conta(a);

3.10.1

Construtor Default

Toda vez que um objeto criado, um construtor da classe correspondente deve ser chamado. Mesmo quando nenhum construtor foi denido explicitamente, h um construtor padro que inserido pelo prprio compilador. O construtor padro s inserido se nenhum construtor foi explicitamente denido e ele no possui parmetros. Portanto, para instanciar uma classe que no possui construtores denidos no cdigo fonte, devemos utilizar o construtor padro j que este inserido automaticamente pelo compilador. www.k19.com.br 32

Orientao a Objetos1 2 3 4 5 // arquivo: Conta.cs class Conta { }

1 2

// Chamando o construtor padro Conta c = new Conta();

Lembrando que o construtor padro s inserido pelo compilador se nenhum construtor foi denido no cdigo fonte. Dessa forma, se voc zer um construtor com parmetros ento no poder utilizar o comando NEW sem passar argumentos pois um erro de compilao ocorrer.1 2 3 4 5 6 7 8 9 10 // arquivo: Agencia.cs class Agencia { public int numero; public Agencia(int numero) { this.numero = numero; } }

1 2

// ERRO DE COMPILACAO Agencia a = new Agencia();

3.10.2

Sobrecarga de Construtores

O conceito de sobrecarga de mtodos pode ser aplicado para construtores. Dessa forma, podemos denir diversos construtores na mesma classe.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // arquivo: Pessoa.cs class Pessoa { public string rg; public int cpf; public Pessoa(string rg) { this.rg = rg; } public Pessoa(int cpf) { this.cpf = cpf; } }

Quando dois ou mais construtores so denidos, h duas ou mais opes no momento de utilizar o comando NEW. 33 K19 Treinamentos

Orientao a Objetos1 2 3 4 // Chamando Pessoa p1 = // Chamando Pessoa p2 = o primeiro construtor new Pessoa("123456X"); o segundo construtor new Pessoa(123456789);

3.10.3

Construtores chamando Construtores

Assim como podemos encadear mtodos tambm podemos encadear construtores.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // arquivo: Conta.cs class Conta { public int numero; public double limite; public Conta(int numero) { this.numero = numero; } public Conta(int numero, double limite) : this(numero) { this.limite = limite; } }

3.11

Exerccios

17. Acrescente um construtor na classe AGENCIA para receber um nmero como parmetro.1 2 3 4 5 6 7 8 9 10 11 // arquivo: Agencia.cs class Agencia { int numero; // ADICIONE O CONSTRUTOR ABAIXO public Agencia(int numero) { this.numero = numero; } }

18. Tente compilar novamente o arquivo T ESTAC ONTA EAGENCIA. Observe o erro de compilao. 19. Altere o cdigo da classe T ESTAC ONTA EAGENCIA para que o erro de compilao seja resolvido. Substitua a linha abaixo:1 Agencia a = new Agencia();

www.k19.com.br

34

Orientao a Objetos Por:1 Agencia a = new Agencia(1234);

Compile novamente o arquivo T ESTAC ONTA EAGENCIA. 20. Acrescente um construtor na classe C ARTAO D E C REDITO para receber um nmero como parmetro.

1 2 3 4 5 6 7 8 9 10 11 12 13 14

// arquivo: CartaoDeCredito.cs class CartaoDeCredito { public int numero; public string dataDeValidade; public Cliente cliente; // ADICIONE O CONSTRUTOR ABAIXO public CartaoDeCredito(int numero) { this.numero = numero; } }

21. Tente compilar novamente os arquivos T ESTAC ARTAO D E C REDITO e T ESTAC LIENTE EC ARTAO. Observe os erros de compilao. 22. Altere o cdigo da classe T ESTAC ARTAO D E C REDITO e T ESTAC LIENTE EC ARTAO para que os erros de compilao sejam resolvidos. Substitua trechos de cdigo semelhantes ao trecho abaixo:

1 2

CartaoDeCredito cdc1 = new CartaoDeCredito(); cdc1.numero = 111111;

Por trechos de cdigo semelhantes ao trecho abaixo:

1

CartaoDeCredito cdc = new CartaoDeCredito(111111);

Compile novamente os arquivos T ESTAC ARTAO D E C REDITO e T ESTAC LIENTE EC AR TAO . 23. Acrescente um construtor na classe C ONTA para receber uma referncia como parmetro. 35 K19 Treinamentos

Orientao a Objetos1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // arquivo: Conta.cs class Conta { public double saldo = 100.0; public Agencia agencia; // ADICIONE O CONSTRUTOR ABAIXO public Conta(Agencia agencia) { this.agencia = agencia; } public void Deposita(double valor) { this.saldo += valor; } public void Saca(double valor) { this.saldo -= valor; } public void ImprimeExtrato() { System.Console.WriteLine("SALDO: " + this.saldo); } }

24. Tente compilar novamente os arquivos T ESTAC ONTA EAGENCIA, T ESTA M ETODOS C ONTA e T ESTAVALORES D EFAULT. Observe os erros de compilao. 25. Altere o cdigo da classe T ESTAC ONTA EAGENCIA, T ESTA M ETODOS C ONTA e T ES TAVALORES D EFAULT para que o erros de compilao sejam resolvidos. Substitua trechos de cdigo semelhantes ao trecho abaixo:1 2 Agencia a = new Agencia(1234); Conta c = new Conta();

Por trechos de cdigo semelhantes ao trecho abaixo:1 2 Agencia a = new Agencia(1234); Conta c = new Conta(a);

Tambm substitua trechos de cdigo semelhantes ao trecho abaixo:1 Conta c = new Conta();

Por trechos de cdigo semelhantes ao trecho abaixo:1 2 Agencia a = new Agencia(1234); Conta c = new Conta(a);

www.k19.com.br

36

Orientao a Objetos Compile novamente os arquivos T ESTAC ONTA EAGENCIA, T ESTA M ETODOS C ONTA e T ESTAVALORES D EFAULT.

3.12

Referncias como parmetro

Assim como podemos passar valores primitivos como argumentos para um mtodo ou construtor tambm podemos passar valores no primitivos (referncias). Suponha um mtodo na classe C ONTA que implemente a lgica de transferncia de valores entre contas. Esse mtodo deve receber como argumento alm do valor a ser transferido a conta que receber o dinheiro.1 2 3 4 5 public void Transfere(Conta destino, double valor) { this.saldo -= valor; destino.saldo += valor; }

Na chamada do mtodo TRANSFERE, devemos ter duas referncias de contas: uma para chamar o mtodo e outra para passar como parmetro.1 2 3 4 5 6 Conta origem = new Conta(); origem.saldo = 1000; Conta destino = new Conta(); origem.Transfere(destino, 500);

Quando a varivel DESTINO passada como parmetro, somente a referncia armazenada nessa varivel enviada para o mtodo TRANSFERE e no o objeto correspondente a referncia. Em outras palavras, somente o link para a conta que receber o valor da transferncia enviado para o mtodo TRANSFERE.

3.13

Exerccios

26. Acrescente um mtodo na classe C ONTA para implementar a lgica de transferncia de valores entre contas.1 2 3 4 5 public void Transfere(Conta destino, double valor) { this.saldo -= valor; destino.saldo += valor; }

27. Faa um teste para vericar o funcionamento do mtodo transfere. 37 K19 Treinamentos

Orientao a Objetos1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // arquivo: TestaMetodoTransfere.cs class TestaMetodoTransfere { static void Main() { Agencia a = new Agencia(1234); Conta origem = new Conta(a); origem.saldo = 1000; Conta destino = new Conta(a); destino.saldo = 1000; origem.Transfere(destino, 500); System.Console.WriteLine(origem.saldo); System.Console.WriteLine(destino.saldo); } }

Compile e execute a classe T ESTA M ETODOT RANSFERE.

www.k19.com.br

38

Captulo 4 ArraysSuponha que o sistema de uma loja virtual precisa armazenar os preos dos produtos que ela comercializa. No seria nada prtico declarar para cada produto uma varivel que armazena o preo do mesmo. Para isso, possvel utilizar as estruturas chamadas Arrays. Um Array uma estrutura que armazena um ou mais valores de um determinado tipo. Um array pode ser criado com o comando new.1 double[] precos = new double[100];

A varivel precos armazena uma referncia de um array criado na memria RAM do computador. Na memria, o espao ocupado por esse array est dividido em 100 pedaos iguais numerados de 0 at 99. Cada pedao pode armazenar um valor do tipo double. Quando um array criado, as posies dele so inicializadas com os valores default.1 2 3 double[] precos = new double[100]; precos[0] = 130.5; precos[99] = 17.9;

Acessar posies fora do intervalo de ndices de um array gera um erro de execuo. No momento da criao de um array, os seus valores podem ser denidos.1 double[] precos = new double[2]{100.4,87.5};

1

double[] precos = new double[]{100.4,87.5};

1

double[] precos = {100.4,87.5};

39

Arrays

4.1

Arrays Multidimensionais

possvel criar arrays de vrias dimenses. Isso permite a criao de estruturas para armazenar os valores de uma tabela.1 2 double[,] tabela = new double[2,3]; tabela[0,0] = 10.7;

1 2

double[,] tabela = new double[2,2]{{1.6,3.7},{9.6,7.5}}; System.Console.WriteLine(tabela[0,0]);

1 2

double[,] tabela = new double[,]{{1.6,3.7},{9.6,7.5}}; System.Console.WriteLine(tabela[0,0]);

4.2

Arrays de Arrays - Jagged Arrays

Alm dos arrays multidimensionais possvel criar arrays de arrays. Inclusive cada os arrays de um array podem ter tamanhos diferentes.1 2 3 4 5 6 7 double[][] arrays = new double[3][]; arrays[0] = new double[2]; arrays[1] = new double[3]; arrays[2] = new double[4]; arrays[0][0] = 10.5;

1 2 3 4 5 6

double[][] arrays = { new double[2]{1.5, 3.7}, new double[3]{6.6, 9.7, 6.7}, new double[4]{8.5, 2.8, 7.5, 8.6} }; System.Console.WriteLine(arrays[0][0]);

4.3

Percorrendo Arrays

Os arrays podem ser facilmente preenchidos utilizando o comando while ou o for.1 2 3 4 5 double[] precos = new double[100]; for(int i = 0; i < 100; i++) { precos[i] = i; }

www.k19.com.br

40

Arrays1 2 3 4 5 6 7 8 double[,] tabela = new double[100,50]; for(int i = 0; i < 100; i++) { for(int j = 0; j < 50; j++) { tabela[i, j] = i * j; } }

A quantidade de elementos em cada dimenso dos arrays pode ser obtida atravs do mtodo getLength. A quantidade de elementos em todas as dimenses pode ser obtida atravs da propriedade Length.1 2 3 4 5 6 7 8 9 double[,] tabela = new double[100,50]; for(int i = 0; i < tabela.getLength(0); i++) { for(int j = 0; j < tabela.getLength(1); j++) { tabela[i, j] = i * j; } } System.Console.WriteLine(tabela.Length);

Para acessar todos os elementos de um array, possvel aplicar o comando foreach.1 2 3 4 5 double[,] tabela = new double[,] { { 1.6, 3.7 }, { 9.6, 7.5 }}; foreach(double e in tabela) { System.Console.WriteLine(e); }

4.4

Operaes

Ordenando um ArraySuponha um array de strings criado para armazenar alguns nomes de pessoas. comum querer ordenar esses nomes utilizando a ordem alfabtica. Essa tarefa pode ser realizada atravs do mtodo Sort.1 2 3 4 5 6 7 string[] nomes = new string[]{"rafael", "jonas", "marcelo" }; System.Array.Sort(nomes); foreach (string nome in nomes) { System.Console.WriteLine(nome); }

Invertendo um ArrayPara inverter os elementos de um array, o mtodo Reverse pode ser utilizado. 41 K19 Treinamentos

Arrays1 2 3 4 5 6 7 8 string[] nomes = new string[] {"rafael", "jonas", "marcelo" }; System.Array.Sort(nomes); System.Array.Reverse(nomes); foreach (string nome in nomes) { System.Console.WriteLine(nome); }

Copiando um ArrayPara copiar o contedo de um array para outro, deve ser utilizado o mtodo CopyTo.1 2 3 string[] nomes = new string[] {"rafael", "jonas", "marcelo" }; string[] nomesCopia = new string[3]; nomes.CopyTo(nomesCopia, 0);

4.5

Exerccios

1. Dentro da sua pasta de exerccios crie uma pasta para os arquivos desenvolvidos nesse captulo chamada arrays.

2. Crie um programa que imprima na tela os argumentos passados na linha de comando para o mtodo MAIN. www.k19.com.br 42

Arrays1 2 3 4 5 6 7 8 9 10 11 // arquivo: Imprime.cs class Imprime { static void Main(string[] args) { foreach (string arg in args) { System.Console.WriteLine(arg); } } }

Compile e execute a classe I MPRIME. Na execuo no esquea de passar alguns parmetros na linha de comando. Imprime.exe Rafael Alex Daniel Jonas 3. Faa um programa que ordene o array de strings recebido na linha de comando.1 2 3 4 5 6 7 8 9 10 11 12 13 // arquivo: Ordena.cs class Ordena { static void Main(string[] args) { System.Array.Sort(args); foreach (string arg in args) { System.Console.WriteLine(arg); } } }

Compile e execute a classe O RDENA. Na execuo no esquea de passar alguns parmetros na linha de comando. Ordena.exe Rafael Alex Daniel Jonas 4. (Opcional) Faa um programa que calcule a mdia dos elementos recebidos na linha de comando. Dica: para converter strings para double pode ser utilizado um cdigo semelhante a este:1 2 string s = "10"; double d = System.Convert.ToDouble(s);

5. (Opcional) Crie um programa que encontre o maior nmero entre os valores passados na linha de comando. 6. (Opcional) Crie um array de arrays na forma de tringulo com os valores do padro abaixo e imprima na tela esses valores. 43 K19 Treinamentos

Arrays 1 1 1 1 1

2 2 3 2 3 4 2 3 4 5

www.k19.com.br

44

Captulo 5 IDE - Integrated Development EnvironmentNo cotidiano do desenvolvimento de software, comum querer aumentar a produtividade. A produtividade pode ser analisada em diversos aspectos, qualidade do software e velocidade de desenvolvimento so alguns deles. A criao de um software envolve algumas etapas fundamentais. Por exemplo: codicao, compilao, testes, documentao e debug. Em cada uma dessas etapas, uma ferramenta poderia auxiliar o desenvolvedor a m de melhorar a produtividade. Da surge o conceito de IDE, Ambiente de Desenvolvimento Integrado. Uma IDE uma ferramenta que prov facilidades para o desenvolvedor realizar as principais tarefas relacionadas ao desenvolvimento de um software. No caso especco da tecnologia .NET, a IDE mais utilizada e a ferramenta da Microsoft, o Microsoft Visual Studio. Essa ferramenta bem abrangente e oferece recurcos sosticados para o desenvolvimento de uma aplicao .NET. Contudo, ela no gratuita. Por outro lado, h verses modicadas do Microsoft Visual Studio fornecidas gratuitamente pela prpria Microsoft. Por exemplo, para desenvolver uma aplicao, utilizando a linguagem C#, h uma IDE chamada Microsoft Visual C# Express. Essa IDE ser utilizada nesse treinamento. Conra a pgina de download do Microsoft Visual C# Express: http://www.microsoft.com/express/download/.

5.1

Exerccios

1. Faa um novo projeto no Microsoft Visual C# Express e crie um programa que imprime na tela a mensagem "Ol Mundo". Tela inicial do Microsoft Visual C# Express: 45

IDE - Integrated Development Environment

Para criar um novo projeto, clique no menu File->New Project ou digite o atalho CTRL + SHIFT + N. Depois, selecione o template Empty Project, dena o nome do projeto como "OlaMundo"e clique no boto OK.

Aps a criao do projeto OlaMundo, ele deve aparecer na view Solution Explorer no canto direito. Clique com o boto direito do mouse no projeto OlaMundo e selecione o menu Add->New Item. www.k19.com.br 46

IDE - Integrated Development Environment

Na tela de criao de novo item, selecione o template Code File, dena o nome do arquivo com OlaMundo.cs e clique em no boto Add.

Digite o cdigo para imprimir na tela a mensagem "Ol Mundo". 47 K19 Treinamentos

IDE - Integrated Development Environment

Para compilar, clique no menu Build->Build Solution ou digite o atalho F6. Para executar, digite o atalho CTRL + F5. Salve o projeto atravs do menu File-> SaveAll na pasta padro do Microsoft Visual C# Express.

www.k19.com.br

48

Captulo 6 Atributos e Mtodos de Classe6.1 Atributos Estticos

Num sistema bancrio, provavelmente, criaramos uma classe para especicar os objetos que representariam os funcionrios do banco.1 2 3 4 5 6 7 8 9 10 class Funcionario { public string nome; public double salario; public void AumentaSalario(double aumento) { this.salario += aumento; } }

Supondo que o banco possui um piso salarial para os seus funcionrios e que o sistema tem que guardar esse valor, poderamos denir um atributo na classe F UNCIONARIO para tal propsito.1 2 3 4 5 6 7 8 9 10 11 class Funcionario { public string nome; public double salario; public double pisoSalarial; public void AumentaSalario(double aumento) { this.salario += aumento; } }

O atributo PISO S ALARIAL de instncia, ou seja, cada objeto criado a partir da classe F UN CIONARIO teria o seu prprio atributo PISO S ALARIAL . Porm, no faz sentido ter o valor do piso salarial repetido em todos os objetos j que esse valor nico para todos os funcionrios. Para que o atributo PISO S ALARIAL no se repita em cada objeto da classe F UNCIONARIO, devemos torn-lo um atributo de classe ao invs de atributo de instncia. Para isso devemos aplicar o modicador static na declarao do atributo. 49

Atributos e Mtodos de Classe1 2 3 4 5 6 7 8 9 10 11 class Funcionario { public string nome; public double salario; public static double PisoSalarial; public void AumentaSalario(double aumento) { this.salario += aumento; } }

Um atributo de classe deve ser acessado atravs do nome da classe na qual ele foi declarado.1 Funcionario.PisoSalarial = 2000;

6.2

Mtodos Estticos

Da mesma forma que denimos mtodos para implementar as lgicas que manipulam os valores dos atributos de instncia, podemos fazer o mesmo para os atributos de classe. Suponha que o banco tenha um procedimento para reajustar o piso salarial baseado em uma taxa. Poderamos denir um mtodo na classe F UNCIONARIO para implementar esse reajuste.1 2 3 4 public void ReajustaPisoSalarial(double taxa) { Funcionario.PisoSalarial += Funcionario.PisoSalarial * taxa; }

O mtodo R EAJUSTA P ISO S ALARIAL () de instncia, ou seja, deve ser invocado a partir da referncia de um objeto da classe F UNCIONARIO. Porm, como o reajuste do piso salarial no depende dos dados de um funcionrio em particular no faz sentido precisar de uma referncia de um objeto da classe F UNCIONARIO para poder fazer o reajuste. Neste caso, poderamos denir o R EAJUSTA P ISO S ALARIAL () como mtodo de classe ao invs de mtodo de instncia atravs do modicador STATIC. Dessa forma, o reajuste poderia ser executado independentemente da existncia de objetos da classe F UNCIONARIO.1 2 3 4 public static void ReajustaPisoSalarial(double taxa) { Funcionario.PisoSalarial += Funcionario.PisoSalarial * taxa; }

Um mtodo de classe deve ser invocado atravs do nome da classe na qual ele foi denido.1 Funcionario.ReajustaPisoSalarial(0.1);

www.k19.com.br

50

Atributos e Mtodos de Classe

6.3

Exerccios

1. Crie um projeto no Microsoft Visual C# Express chamado Static.

2. Crie uma classe chamada Conta no projeto S TATIC. Dena um atributo de classe para contabilizar o nmero de objetos instanciados a partir da classe C ONTA. Esse atributo deve ser incrementado toda vez que um objeto criado. Voc pode utilizar construtores para fazer o incremento.

1 2 3 4 5 6 7 8 9 10 11

class Conta { // ATRIBUTO DE CLASSE public static int Contador; // CONSTRUTOR public Conta() { Conta.Contador++; } }

3. Faa um teste criando dois objetos da classe C ONTA e imprimindo o valor do contador de contas antes, entre e depois da criao dos objetos.

1 2 3 4 5 6 7 8 9 10 11

class Teste { static void Main() { System.Console.WriteLine("Contador: " + Conta.Contador); Conta c1 = new Conta(); System.Console.WriteLine("Contador: " + Conta.Contador); Conta c2 = new Conta(); System.Console.WriteLine("Contador: " + Conta.Contador); } }

4. O contador de contas pode ser utilizado para gerar um nmero nico para cada conta. Acrescente na classe C ONTA um atributo de instncia para guardar o nmero das contas e implemente no construtor a lgica para gerar esses nmeros de forma nica atravs do contador de contas. 51 K19 Treinamentos

Atributos e Mtodos de Classe1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class Conta { // ATRIBUTO DE CLASSE public static int Contador; // ATRIBUTO DE INSTANCIA public int numero; // CONSTRUTOR public Conta() { Conta.Contador++; this.numero = Conta.Contador; } }

5. Altere o teste para imprimir o nmero de cada conta criada.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

class Teste { static void Main() { System.Console.WriteLine("Contador: " + Conta.Contador); Conta c1 = new Conta(); System.Console.WriteLine("Numero da primeira conta: " + c1.numero); System.Console.WriteLine("Contador: " + Conta.Contador); Conta c2 = new Conta(); System.Console.WriteLine("Numero da segunda conta: " + c2.numero); System.Console.WriteLine("Contador: " + Conta.Contador); } }

6. (Opcional) Dena um mtodo de classe na classe C ONTA para zerar o contador e imprimir o total de contas anterior.

1 2 3 4 5 6 7

// METODO DE CLASSE public static void ZeraContador() { System.Console.WriteLine("Contador: " + Conta.Contador); System.Console.WriteLine("Zerando o contador de contas..."); Conta.Contador = 0; }

7. (Opcional) Altere o teste para utilizar o mtodo Z ERAC ONTADOR (). www.k19.com.br 52

Atributos e Mtodos de Classe1 2 3 4 5 6 7 8 9 10 11 12 13 class Teste { static void Main() { Conta c1 = new Conta(); System.Console.WriteLine("Numero da primeira conta: " + c1.numero); Conta c2 = new Conta(); System.Console.WriteLine("Numero da segunda conta: " + c2.numero); Conta.ZeraContador(); } }

8. (Opcional) Crie uma classe para modelar os funcionrios do banco. Dena nessa classe um atributo para armazenar o piso salarial. 9. (Opcional) Faa um teste para vericar o funcionamento do piso salarial. 10. (Opcional) Dena um mtodo para reajustar o piso salarial a partir de uma taxa.

53

K19 Treinamentos

Atributos e Mtodos de Classe

www.k19.com.br

54

Captulo 7 Encapsulamento7.1 Atributos Privados

No sistema do banco, cada objeto da classe F UNCIONARIO possuiria um atributo para guardar o salrio do funcionrio que ele representa.1 2 3 4 class Funcionario { public double salario; }

O atributo SALARIO de um objeto da classe F UNCIONARIO pode ser acessado ou modicado por cdigo escrito por qualquer classe. Portanto, o controle do atributo SALARIO descentralizado dicultando a deteco de erros relacionados manipulao dos salrios dos funcionrios. Para obter um controle centralizado, podemos fazer o atributo SALARIO ser privado na classe F UNCIONARIO e criar mtodos para implementar as lgicas que utilizam o valor desse atributo.1 2 3 4 5 6 7 8 9 class Funcionario { double salario; public void AumentaSalario(double aumento) { // lgica para aumentar o salrio } }

Um atributo privado s pode ser acessado ou alterado por cdigo escrito na classe na qual ele foi denido. Se algum cdigo fora da classe F UNCIONARIO tenta acessar ou alterar o valor do atributo privado SALARIO de um objeto da classe F UNCIONARIO um erro de compilao gerado. Denir todos os atributos como privados e mtodos para implementar as lgicas de acesso e alterao quase uma regra da orientao a objetos. O intuito ter sempre um controle centralizado do dados dos objetos para facilitar a manuteno do sistema. 55

Encapsulamento

7.2

Mtodos Privados

O papel de alguns mtodos de uma classe pode ser auxiliar outros mtodos da mesma classe. E muitas vezes, no correto chamar esses mtodos auxiliares diretamente. Para garantir que mtodos auxiliares no sejam chamados por cdigo escrito fora da classe na qual eles foram denidos, podemos faz-los privados.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

class Conta { double saldo; public void Deposita(double valor) { this.saldo += valor; this.DescontaTarifa(); } public void Saca(double valor) { this.saldo -= valor; this.DescontaTarifa(); } void DescontaTarifa() { this.saldo -= 0.1; } }

No exemplo acima, o mtodo D ESCONTATARIFA () um mtodo auxiliar dos mtodos D EPOSITA () e S ACA (). Alm disso, ele no deve ser chamado diretamente pois a tarifa s deve ser descontada quando ocorre um depsito ou um saque.

7.3

Mtodos Pblicos

Os mtodos que devem ser acessados a partir de qualquer parte do sistema devem possuir o modicador de visibilidade public. www.k19.com.br 56

Encapsulamento1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class Conta { double saldo; public void Deposita(double valor) { this.saldo += valor; this.DescontaTarifa(); } public void Saca(double valor) { this.saldo -= valor; this.DescontaTarifa(); } void DescontaTarifa() { this.saldo -= 0.1; } }

7.4

Implementao e Interface de Uso

Dentro de um sistema orientado a objetos cada objeto realiza um conjunto de tarefas de acordo com as suas responsabilidades. Por exemplo, os objetos da classe C ONTA realizam as operaes de sacar, depositar, transferir ou gerar extrato. Para descobrir o que um objeto pode fazer basta olhar para as assinaturas dos mtodos pblicos denidos na classe desse objeto. A assinatura de um mtodo composta pelo seu tipo de retorno, seu nome e seus parmetros. As assinaturas dos mtodos pblicos de um objeto formam a sua interface de uso. Por outro lado, para descobrir como um objeto da classe C ONTA realiza as suas operaes devemos observar o corpo de cada um dos mtodos da classe C ONTA. Os corpos dos mtodos denem a implementao das operaes dos objetos.

7.5

Escondendo a implementao

Uma das idias mais importantes da orientao a objetos o encapsulamento. Encapsular signica esconder a implementao dos objetos. O encapsulamento favorece principalmente dois aspectos de um sistema: a manuteno e o desenvolvimento. A manuteno favorecida pelo encapsulamento porque quando a implementao de um objeto tem que ser alterada basta modicar a classe do objeto. O desenvolvimento favorecido pelo encapsulamento pois podemos separar o trabalho dos desenvolvedores de forma mais independente.

ExemplosO conceito do encapsulamento pode ser identicado em diversos exemplos do cotidiano. Mostraremos alguns desses exemplos para esclarecer melhor a ideia. 57 K19 Treinamentos

Encapsulamento

CelularHoje em dia, as pessoas esto acostumadas com os celulares. Os botes, a tela e os menus do celular forma a interface de uso do mesmo. Em outras palavras, o usurio interage com o celular atravs dos botes, da tela e dos menus. Os dispositivos internos do celular e os processos que transformam o som capturado pelo microfone em ondas que podem ser transmitidas para uma antena da operadora de telefonia mvel formam a implementao do celular. Do ponto de vista do usurio do celular, para fazer uma ligao, basta digitar o nmero do telefone desejado e clicar no boto que efetua ligao. Porm, diversos processos complexos so realizados pelo celular para que as pessoas possam conversar atravs dele. Se os usurios tivessem que ter conhecimento de todo o funcionamento interno do celular certamente a maioria das pessoas no teria celular. No contexto da orientao a objetos, aplicamos o encapsulamento para criar objetos mais simples de serem utilizados em qualquer parte do sistema.

CarroA interface de uso de um carro composta pelos dispositivos que permitem que o motorista conduza o veculo (volante, pedais, alavanca do cambio, etc). A implementao do carro composta pelos dispositivos internos (motor, caixa de cmbio, radiador, sistema de injeo eletrnica ou carburador, etc) e pelos processos realizados internamente por esses dispositivos. Nos carros mais antigos, o dispositivo interno que leva o combustvel para o motor o carburador. Nos carros mais novos, o carburador foi substitudo pelo sistema de injeo eletrnica. Inclusive, algumas ocinas especializadas substituem o carburador pelo sistema de injeo eletrnica. Essa alterao na implementao do carro no afeta a maneira que o motorista dirige. Todo mundo que sabe dirigir um carro com carburador sabe dirigir um carro com injeo eletrnica. Hoje em dia, as montadoras fabricam veculos com cmbio mecnico ou automtico. O motorista acostumado a dirigir carros com cmbio mecnico pode ter diculdade para dirigir carros com cmbio automtico e vice-versa. Quando a interface de uso do carro alterada, a maneira de dirigir afetada fazendo com que as pessoas que sabem dirigir tenham que se adaptar. No contexto da orientao a objetos, aplicando o conceito do encapsulamento, as implementaes dos objetos cam "escondidas"ento podemos modic-las sem afetar a maneira de utilizar esses objetos. Por outro lado, se alterarmos a interface de uso que est exposta afetaremos a maneira de usar os objetos. Suponha uma troca de nome de mtodo pblico, todas as chamadas a esse mtodo devem ser alteradas.

Mquinas de PorcariasEstamos acostumados a utilizar mquinas de refrigerantes, de salgadinhos, de doces, de caf, etc. Em geral, essas mquinas oferecem uma interface de uso composta por: Entradas para moedas ou cdulas. Botes para escolher o produto desejado. www.k19.com.br 58

Encapsulamento Sada do produto. Sada para o troco (opcional).

Normalmente, essas mquinas so extremamente protegidas, para garantir que nenhum usurio mal intencionado ou no tente alterar a implementao da mquina, ou seja, tente alterar como a mquina funciona por dentro. Levando essa ideia para um sistema orientado a objetos, um objeto deve ser bem protegido para que outros objetos no prejudiquem o funcionamento interno do objeto.

7.6

Acesso e Alterao de atributos

Aplicando a ideia do encapsulamento, os atributos deveriam ser todos privados. Assim, os atributos no podem ser acessados ou alterados por cdigo escrito fora da classe na qual eles foram denidos. Porm, muitas vezes, as informaes armazenadas nos atributos precisam ser consultadas de qualquer lugar do sistema. Nesse caso, podemos disponibilizar mtodos para consultar os valores dos atributos.1 2 3 4 5 6 7 8 9 class Cliente { string nome; public string ConsultaNome() { return this.nome; } }

Da mesma forma, eventualmente, queremos alterar o valor de um atributo a partir de qualquer lugar do sistema. Nesse caso, tambm poderamos criar um mtodo para essa tarefa.1 2 3 4 5 6 7 8 9 class Cliente { string nome; public void AlteraNome(string nome) { this.nome = nome; } }

Muitas vezes, necessrio consultar e alterar o valor de um atributo a partir de qualquer lugar do sistema. Nessa situao, podemos denir os dois mtodos discutidos anteriormente. Mas, o que melhor? Criar os dois mtodos (um de leitura outro de escrita) ou deixar o atributo pblico? Utilizando os mtodos, podemos controlar como as alteraes ou as consultas so feitas. Ou seja, temos um controle maior. 59 K19 Treinamentos

Encapsulamento

7.7

Propriedades

A linguagem C# disponibiliza uma outra maneira para acessar os atributos, as propriedades. Uma propriedade, basicamente, agrupa os mtodos consulta e alterao dos atributos.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Cliente { string nome; public string Nome { get { return this.nome; } set { this.nome = value; } } }

A sintaxe de utilizao das propriedades semelhante a de utilizao dos atributos pblicos.1 joao.Nome = "Joo";

7.8

Exerccios

1. Crie um projeto no Microsoft Visual C# Express chamado Encapsulamento.

2. Dena uma classe para representar os funcionrios do banco com um atributo para guardar os salrios e outro para os nomes.

1 2 3 4 5

class Funcionario { public double salario; public string nome; }

3. Teste a classe F UNCIONARIO criando um objeto e manipulando os atributos. www.k19.com.br 60

Encapsulamento1 2 3 4 5 6 7 8 9 10 11 12 13 class Teste { static void Main() { Funcionario f = new Funcionario(); f.nome = "Rafael Cosentino"; f.salario = 2000; System.Console.WriteLine(f.nome); System.Console.WriteLine(f.salario); } }

Perceba que a classe T ESTE pode acessar ou modicar os valores dos atributos de um objeto da classe F UNCIONARIO. Execute o teste!

4. Aplique a ideia do encapsulamento tornando os atributos denidos na classe F UNCIO NARIO privados.

1 2 3 4 5

class Funcionario { double salario; string nome; }

Observe que a classe T ESTE no compila mais. Lembre que um atributo privado s pode ser acessado por cdigo escrito na prpria classe do atributo.

5. Crie mtodos de acessado com nome padronizados para os atributos da classe F UNCIO NARIO . 61 K19 Treinamentos

Encapsulamento1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 class Funcionario { double salario; string nome; public double Salario { get { return this.salario; } set { this.salario = value; } } public string Nome { get { return this.nome; } set { this.nome = value; } } }

6. Altere a classe T ESTE para que ela utilize os mtodos de acesso ao invs de manipular os atributos do objeto funcionrio diretamente.1 2 3 4 5 6 7 8 9 10 11 12 13 class Teste { static void Main() { Funcionario f = new Funcionario(); f.Nome = "Rafael Cosentino"; f.Salario = 2000; System.Console.WriteLine(f.Nome); System.Console.WriteLine(f.Salario); } }

Execute o teste!

www.k19.com.br

62

Captulo 8 Herana8.1 Reutilizao de Cdigo

Um banco oferece diversos servios que podem ser contratados individualmente pelos clientes. Suponha que todos os servios possuem basicamente: o cliente que contratou, o funcionrio responsvel pela contratao e data de contratao. O sistema do banco deve estar preparado para gerenciar esses servios. Com o intuito de ser produtivo, a modelagem dos servios do banco deve diminuir a repetio de cdigo. A ideia reaproveitar o mximo do cdigo j criado. Essa ideia est diretamente relacionada ao conceito Dont Repeat Yourself. Em outras palavras, devemos minimizar ao mximo a utilizao do "copiar e colar". O aumento da produtividade e a diminuio do custo de manuteno so as principais motivaes do DRY. Em seguida, vamos discutir algumas modelagens possveis para os servios do banco. Buscaremos seguir a ideia do DRY na criao dessas modelagens.

Uma classe para todos os serviosPoderamos denir apenas uma classe para modelar todos os tipos de servios que o banco oferece.1 2 3 4 5 6 7 8 class Servico { Cliente contratante; Funcionario responsavel; string dataDeContratacao; // propriedades }

EmprstimoO emprstimo um dos servios que o banco oferece. Quando um cliente contrata esse servio so denidos o valor e a taxa de juros mensal do emprstimo. Devemos acrescentar dois atributos na classe S ERVICO, um para o valor outro para a taxa de juros do servio de emprstimo. 63

Herana1 2 3 4 5 6 7 8 9 10 11 class Servico { Cliente contratante; Funcionario responsavel; string dataDeContratacao; double valor; double taxa; // propriedades }

Seguro de veculosOutro servio oferecido pelo banco o seguro de veculos. Para esse servio devem ser denidas as seguintes informaes: veculo segurado, valor do seguro e a franquia. Devemos adicionar trs atributos na classe S ERVICO.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Servico { // GERAL Cliente contratante; Funcionario responsavel; string dataDeContratacao; // EMPRESTIMO double valor; double taxa; // SEGURO DE VEICULO Veiculo veiculo; double valorDoSeguroDeVeiculo; double franquia; // propriedades }

Apesar de seguir a ideia do DRY, modelar todos os servios com apenas uma classe pode dicultar o desenvolvimento. Supondo que dois ou mais desenvolvedores so responsveis pela implementao dos servios ento eles provavelmente codicariam a mesma classe concorrentemente. Alm disso, os desenvolvedores, principalmente os recm chegados no projeto do banco, cariam confusos com o cdigo extenso da classe S ERVICO. Outro problema que um objeto da classe S ERVICO possui atributos para todos os servios que o banco oferece mas na verdade deveria possuir apenas os atributos relacionados a um servio. Do ponto de vista de performance, essa abordagem causaria um consumo desnecessrio de memria.

Uma classe para cada servioPara modelar melhor os servios, evitando uma quantidade grande de atributos e mtodos desnecessrios, criaremos uma classe para cada servio. www.k19.com.br 64

Herana1 2 3 4 5 6 7 8 9 10 11 12 13 14 class SeguroDeVeiculo { // GERAL Cliente contratante; Funcionario responsavel; string dataDeContratacao; // SEGURO DE VEICULO Veiculo veiculo; double valorDoSeguroDeVeiculo; double franquia; // propriedades }

1 2 3 4 5 6 7 8 9 10 11 12 13

class Emprestimo { // GERAL Cliente contratante; Funcionario responsavel; string dataDeContratacao; // EMPRESTIMO double valor; double taxa; // propriedades }

Criar uma classe para cada servio, torna o sistema mais exvel, pois qualquer alterao em um determinado servio no causar efeitos colaterais nos outros. Mas, por outro lado, essas classes teriam bastante cdigo repetido, contrariando a ideia do DRY. Alm disso, qualquer alterao que deva ser realizada em todos os servios precisa ser implementada em cada uma das classes.

Uma classe genrica e vrias especcasNa modelagem dos servios do banco, podemos aplicar um conceito da orientao a objetos chamado Herana. A ideia reutilizar o cdigo de uma determinada classe em outras classes. Teramos a classe S ERVICO com os atributos e mtodos que todos os servios devem ter e uma classe para cada servio com os atributos e mtodos especcos do determinado servio. As classes especcas seriam "ligadas"de alguma forma classe S ERVICO para reaproveitar o cdigo nela denido. Esse relacionamento entre as classes representado em UML pelo diagrama abaixo: 65 K19 Treinamentos

Herana

Os objetos das classes especcas: E MPRESTIMO e S EGURO D E V EICULO) possuiriam tanto os atributos e mtodos denidos nessas classes quanto os denidos na classe S ERVICO.1 2 3 Emprestimo e = new Emprestimo(); e.DataDeContratacao = "10/10/2010"; e.Valor = 10000;

As classes especcas so vinculadas com a classe genrica utilizando o comando : e no precisam redenir o contedo j declarado na classe genrica.1 2 3 4 5 6 class Servico { Cliente contratante; Funcionario responsavel; string dataDeContratacao; }

1 2 3 4 5

class Emprestimo : Servico { double valor; double taxa; }

1 2 3 4 5 6

class SeguroDeVeiculo : Servico { Veiculo veiculo; double valorDoSeguroDeVeiculo; double franquia; }

A classe genrica denominada de super classe, classe base ou classe me. As classes especcas so denominadas sub classes, classes derivadas ou classes lhas. www.k19.com.br 66

Herana

8.2

Reescrita de Mtodo

Preo FixoSuponha que todo servio do banco possui uma taxa administrativa que deve ser paga pelo cliente que contratar o servio. Inicialmente, vamos considerar que o valor dessa taxa igual para todos os servios do banco. Neste caso, poderamos implementar um mtodo na classe S ERVICO para calcular o valor da taxa. Este mtodo ser reaproveitado por todas as classes que herdam da classe S ERVICO.1 2 3 4 5 6 7 8 9 class Servico { // ATRIBUTOS public double CalculaTaxa() { return 10; } }

Alguns preos diferentesSuponha que o valor da taxa administrativa do servio de emprstimo diferente dos outros servios pois ele calculado a partir do valor emprestado ao cliente. Como esta lgica especca para o servio de de emprstimo devemos acrescentar um mtodo para implementar esse clculo na classe E MPRESTIMO.1 2 3 4 5 6 7 8 9 class Emprestimo : Servico { // ATRIBUTOS public double CalculaTaxaDeEmprestimo() { return this.valor * 0.1; } }

Para os objetos da classe E MPRESTIMO devemos chamar o mtodo CALCULATAXA D E E MPRESTIMO (). Para todos os outros servios devemos chamar o mtodo C ALCULATAXA (). Mesmo assim, nada impediria que o mtodo C ALCULATAXA () fosse chamado num objeto da classe E MPRESTIMO, pois ela herda esse mtodo da classe S ERVICO. Dessa forma, corremos o risco de algum se equivocar chamando o mtodo errado. Na verdade, gostaramos de "substituir"a implementao do mtodo C ALCULATAXA () herdado da classe S ERVICO na classe E MPRESTIMO para evitar uma chamada errada de mtodo. Por padro, as implementaes dos mtodos de uma superclasse no podem ser substitudas pelas subclasses. Para alterar esse padro, devemos acrescentar o modicador virtual. 67 K19 Treinamentos

Herana1 2 3 4 5 6 7 8 9 class Servico { // ATRIBUTOS public virtual double CalculaTaxa() { return 10; } }

Depois que a classe me Servico autorizou a substituio da implementao do mtodo CalculaTaxa atravs do modicador virtual, basta reescrever o mtodo C ALCULATAXA () na classe E MPRESTIMO com a mesma assinatura que ele possui na classe S ERVICO e com o modicador override.1 2 3 4 5 6 7 8 9 class Emprestimo : Servico { // ATRIBUTOS public override double CalculaTaxa() { return this.valor * 0.1; } }

Os mtodos das classes especcas tm prioridade sobre os mtodos das classes genricas. Em outras palavras, se o mtodo chamado existe na classe lha ele ser chamado, caso contrrio o mtodo ser procurado na classe me.

Fixo + EspeccoSuponha que o preo de um servio a soma de um valor xo mais um valor que depende do tipo do servio. Por exemplo, o preo do servio de emprstimo 5 reais mais uma porcentagem do valor emprestado ao cliente. O preo do servio de seguro de veculo 5 reais mais uma porcentagem do valor do veculo segurado. Em cada classe especca, podemos reescrever o mtodo C ALCULATAXA ().

1 2 3 4 5 6 7 8 9

class Emprestimo : Servico { // ATRIBUTOS public override double CalculaTaxa() { return 5 + this.valor * 0.1; } }

www.k19.com.br

68

Herana1 2 3 4 5 6 7 8 9 class SeguraDeVeiculo : Servico { // ATRIBUTOS public override double CalculaTaxa() { return 5 + this.veiculo.Valor * 0.05; } }

Se o valor xo dos servios for atualizado todas as classes especcas devem ser modicadas. Outra alternativa, seria criar um mtodo na classe S ERVICO para calcular o valor xo de todos os servios e cham-lo dos mtodos reescritos nas classes especcas.1 2 3 4 5 6 7 class Servico { public virtual double CalculaTaxa() { return 5 ; } }

1 2 3 4 5 6 7 8 9

class Emprestimo : Servico { // ATRIBUTOS public override double CalculaTaxa() { return base.CalculaTaxa() + this.valor * 0.1; } }

8.3

Construtores e Herana

Quando temos uma hierarquia de classes, as chamadas dos construtores so mais complexas do que o normal. Pelo menos um construtor de cada classe de uma mesma sequncia hierrquica deve ser chamado ao instanciar um objeto. Por exemplo, quando um objeto da classe E MPRESTIMO, pelo menos um construtor da prpria classe E MPRESTIMO e um da classe S ERVICO devem ser executados. Alm disso, os construtores da classes mais genricas so chamados antes dos construtores das classes especcas.1 2 3 4 5 6 7 class Servico { public Servico() { System.Console.WriteLine("Servico"); } }

69

K19 Treinamentos

Herana1 2 3 4 5 6 7 8 9 class Emprestimo : Servico { // ATRIBUTOS public Emprestimo() { System.Console.WriteLine("Emprestimo"); } }

Por padro, todo construtor chama o construtor sem argumentos da classe me se no existir nenhuma chamada de construtor explcita.

8.4

Exerccios

1. Crie um projeto no Microsoft Visual C# Express chamado Heranca. 2. Dena uma classe para modelar os funcionrios do banco. Sabendo que todo funcionrio possui nome e salrio. Inclua os propriedades dos atributos.1 2 3 4 5 6 7

class Funcionario { string nome; double salario; // propriedades }

3. Crie uma classe para cada tipo especco de funcionrio herdando da classe F UNCIO NARIO . Suponha somente trs tipos especcos de funcionrios: gerentes, telefonistas e secretarias. Os gerentes possuem um nome de usurio e uma senha para acessar o sistema do banco. As telefonistas possuem um cdigo de estao de trabalho. As secretarias possuem um nmero de ramal.1 2 3 4 5 6 7

class Gerente : Funcionario { string usuario; string senha; // propriedades }

1 2 3 4 5 6

class Telefonista : Funcionario { int estacaoDeTrabalho; // propriedades }

www.k19.com.br

70

Herana1 2 3 4 5 6 class Secretaria : Funcionario { int ramal; // propriedades }

4. Teste o funcionamento dos trs tipos de funcionrios criando um objeto de cada uma das classes: G ERENTE, T ELEFONISTA e S ECRETARIA.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

class TestaFuncionarios { static void Main() { Gerente g = new Gerente(); g.Nome = "Rafael Cosentino"; g.Salario = 2000; g.Usuario = "rafael.cosentino"; g.Senha = "12345"; Telefonista t = new Telefonista(); t.Nome = "Carolina Mello"; t.Salario = 1000; t.EstacaoDeTrabalho = 13; Secretaria s = new Secretaria(); s.Nome = "Tatiane Andrade"; s.Salario = 1500; s.Ramal = 198; System.Console.WriteLine("GERENTE"); System.Console.WriteLine("Nome: " + g.Nome); System.Console.WriteLine("Salrio: " + g.Salario); System.Console.WriteLine("Usurio: " + g.Usuario); System.Console.WriteLine("Senha: " + g.Senha); System.Console.WriteLine("TELEFONISTA"); System.Console.WriteLine("Nome: " + t.Nome); System.Console.WriteLine("Salrio: " + t.Salario); System.Console.WriteLine("Estacao de trabalho: " + t.EstacaoDeTrabalho); System.Console.WriteLine("SECRETARIA"); System.Console.WriteLine("Nome: " + s.Nome); System.Console.WriteLine("Salrio: " + s.Salario); System.Console.WriteLine("Ramal: " + s.Ramal); } }

Execute o teste!

5. Suponha que todos os funcionrios possuam uma bonicao de 10% do salrio. Acrescente um mtodo na classe F UNCIONARIO para calcular essa bonicao. 71 K19 Treinamentos

Herana1 2 3 4 5 6 7 8 9 10 11 class Funcionario { string nome; double salario; public double CalculaBonificacao() { return this.salario * 0.1; } // propriedades }

6. Altere a classe T ESTA F UNCIONARIOS para imprimir a bonicao de cada funcionrio alm dos dados que j foram impressos. Depois, execute o teste novamente. 7. Suponha que os gerentes possuam uma bonicao maior que os outros funcionrios. Reescreva o mtodo C ALCULA B ONIFICACAO () na classe G ERENTE. Porm devemos permitir que as classes lhas possam reescrever o mtodo e para tal precisamos alter-lo na classe F UNCIONARIO acrescentando o modicador virtual.

1 2 3 4 5 6 7 8 9 10 11

class Funcionario { string nome; double salario; public virtual double CalculaBonificacao() { return this.salario * 0.1; } // propriedades }

Reescreva o mtodo C ALCULA B ONIFICAO (), execute o teste novamente.

1 2 3 4 5 6 7 8 9 10 11 12

class Gerente : Funcionario { string usuario; string senha; public override double CalculaBonificacao() { return this.Salario * 0.6 + 100; } // propriedades }

8. (Opcional) Dena na classe F UNCIONARIO um mtodo para imprimir alguns dados na tela. www.k19.com.br 72

Herana1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Funcionario { string nome; double salario; public virtual double CalculaBonificacao() { return this.salario * 0.1; } public void MostraDados() { System.Console.WriteLine("Nome: " + this.nome); System.Console.WriteLine("Salrio: " + this.salario); System.Console.WriteLine("Bonificao: " + this.CalculaBonificacao()); } // propriedades }

9. (Opcional) Reescreva o mtodo M OSTRA DADOS () nas classes G ERENTE, T ELEFO NISTA e S ECRETARIA para acrescentar a impresso dos dados especcos de cada tipo de funcionrio. Antes de reescrever o mtodo, devemos permitir a reescrita na classe F UNCIONARIO:1 2 3 4 5 6 public virtual void MostraDados() { System.Console.WriteLine("Nome: " + this.nome); System.Console.WriteLine("Salrio: " + this.salario); System.Console.WriteLine("Bonificao: " + this.CalculaBonificacao()); }

Com a permisso feita atravs do modicador virtual, podemos reescrever segundo o exemplo abaixo:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Gerente : Funcionario { string usuario; string senha; public override double CalculaBonificacao() { return this.Salario * 0.6 + 100; } public override void MostraDados() { base.mostraDados(); System.Console.WriteLine("Usurio: " + this.usuario); System.Console.WriteLine("Senha: " + this.senha); } // propriedades }

10. (Opcional) Modique a classe T ESTA F UNCIONARIO para utilizar o mtodo M OSTRA DADOS (). 73 K19 Treinamentos

Herana1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 class TestaFuncionarios { static void Main() { Gerente g = new Gerente(); g.Nome = "Rafael Cosentino"; g.Salario = 2000; g.Usuario = "rafael.cosentino"; g.Senha = "12345"; Telefonista t = new Telefonista(); t.Nome = "Carolina Mello"; t.Salario = 1000; t.EstacaoDeTrabalho = 13; Secretaria s = new Secretaria(); s.Nome = "Tatiane Andrade"; s.Salario = 1500; s.Ramal = 198; System.Console.WriteLine("GERENTE"); g.MostraDados(); System.Console.WriteLine("TELEFONISTA"); t.MostraDados(); System.Console.WriteLine("SECRETARIA"); s.MostraDados(); } }

11. (Opcional) Dena classes para modelar diversos tipos de contas bancrias: poupana, corrente, conta salrio, entre outros.

www.k19.com.br

74

Captulo 9

Polimorsmo

Os clientes de um banco podem consultar algumas informaes das suas contas atravs de extratos impressos nos caixas eletrnicos. Eventualmente, poderamos criar uma classe para denir um tipo de objeto capaz de gerar extratos de diversos tipos.

1 2 3 4 5 6 7 8 9 10

class GeradorDeExtrato { public void ImprimeExtratoBasico(ContaPoupanca cp) { System.DateTime agora = System.DateTime.Now; System.Console.WriteLine("DATA: " + agora.ToString("D")); System.Console.WriteLine("SALDO: " + cp.Saldo); } }

O mtodo I MPRIME E XTRATO BASICO () gera extratos bsicos somente de contas do tipo poupana. O sistema do banco deve ser capaz de gerar extratos bsicos para os outros tipos de contas tambm. Poderamos implementar outros mtodos na classe G ERADOR D E E XTRATO para trabalhar com os outros tipos de conta, um para cada tipo de conta. 75

Polimorsmo1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class GeradorDeExtrato { public void ImprimeExtratoBasico(ContaPoupanca cp) { System.DateTime agora = System.DateTime.Now; System.Console.WriteLine("DATA: " + agora.ToString("D")); System.Console.WriteLine("SALDO: " + cp.Saldo); } public void ImprimeExtratoBasico(ContaCorrente cc) { System.DateTime agora = System.DateTime.Now; System.Console.WriteLine("DATA: " + agora.ToString("D")); System.Console.WriteLine("SALDO: " + cc.Saldo); } public void ImprimeExtratoBasico(ContaSalario cs) { System.DateTime agora = System.DateTime.Now; System.Console.WriteLine("DATA: " + agora.ToString("D")); System.Console.WriteLine("SALDO: " + cs.Saldo); } }

Como o contedo do extrato bsico o mesmo independentemente do tipo de conta ento os mtodos da classe G ERADOR D E E XTRATO seriam praticamente iguais. Qualquer tipo de mudana no contedo do extrato bsico causaria modicaes em diversos mtodos. Alm disso, se o banco denir um novo tipo de conta ento um mtodo praticamente idntico aos que j existem teria que ser adicionado na classe G ERADOR D E E XTRATO. Analogamente, se o banco extinguir um tipo de conta ento o mtodo correspondente de gerar extrato bsico deve ser retirado do gerador.

9.1

Modelagem das contas

Com o intuito inicial de reutilizar cdigo podemos modelar os diversos tipos de contas do banco utilizando o conceito de herana.1 2 3 4 5 6 class Conta { double saldo; // MAIS ATRIBUTOS E MTODOS }

1 2 3 4 5 6

class ContaPoupanca : Conta { int diaDoAniversario; // MAIS ATRIBUTOS E MTODOS }

www.k19.com.br

76

Polimorsmo1 2 3 4 5 6 class ContaCorrente : Conta { double limite; // MAIS ATRIBUTOS E MTODOS }

9.2

UM (:)

Alm de gerar reaproveitamento de cdigo, a utilizao de herana permite que objetos criados a partir das classes especcas sejam tratados como objetos da classe genrica. Em outras palavras, a herana entre as classes que modelam as contas permite que objetos criados a partir das classes C ONTA P OUPANCA ou C ONTAC ORRENTE sejam tratados como objetos da classe C ONTA. No cdigo da classe C ONTA P OUPANCA utilizamos o smbolo :. Ela pode ser interpretada com a expresso: UM ou UMA.1 2 class ContaPoupanca : Conta //TODA ContaPoupanca UMA Conta

Como est explcito no cdigo que toda conta poupana uma conta ento podemos criar um objeto da classe C ONTA P OUPANCA e trat-lo como um objeto da classe C ONTA.1 2 3 4 5 // Criando um objeto da classe ContaPoupanca ContaPoupanca cp = new ContaPoupanca(); // Tratando o objeto como um objeto da classe Conta Conta c = cp;

Em alguns lugares do sistema do banco ser mais vantajoso tratar um objeto da classe C ONTA P OUPANCA como um objeto da classe C ONTA.

9.3

Melhorando o gerador de extrato

Do ponto de vista do gerador de extrato, o tipo de conta no faz diferena na hora de gerar extratos bsicos. Ento, ao invs de criar um mtodo de gerar extratos bsicos para cada tipo de conta, vamos criar um mtodo genrico que aceite qualquer tipo de conta como parmetro.1 2 3 4 5 6 7 8 9 10 class GeradorDeExtrato { public void ImprimeExtratoBasico(Conta c) { System.DateTime agora = System.DateTime.Now; System.Console.WriteLine("DATA: " + agora.ToString("D")); System.Console.WriteLine("SALDO: " + c.Saldo); } }

77

K19 Treinamentos

Polimorsmo Como o mtodo I MPRIME E XTRATO BASICO () recebe uma conta como parmetro ele pode receber objetos da classe C ONTA P OUPANCA, C ONTAC ORRENTE ou qualquer outra classe que herde direta ou indiretamente da classe C ONTA. A capacidade de tratar objetos criados a partir das classes especcas como objetos de uma classe genrica chamada de Polimorsmo. Aplicando a ideia do polimorsmo no gerador de extratos melhoramos a manutenibilidade da classe G ERADOR D E E XTRATO pois agora qualquer alterao no formato ou no contedo dos extratos bsicos causa modicaes em apenas um mtodo. Fora isso, novos tipos de contas podem ser criadas sem a necessidade de qualquer alterao na classe G ERADOR D E E XTRATO. Analogamente, se algum tipo de conta for extinto nada precisar ser modicado na classe G E RADOR D E E XTRATO .

9.4

Exerccios

1. Crie um projeto no Microsoft Visual C# Express chamado Polimorsmo. 2. Dena uma classe genrica para modelar as contas do banco.

1 2 3 4 5 6

class Conta { double saldo; // propriedades }

3. Dena duas classes especcas para dois tipos de contas