Você está na página 1de 34

Sistemas de Informao e Sistemas para Web

Programao Orientada a Objetos ( implementao: C#)

Profa. Msc. Liliane Jacon

2. Semestre / 2009

INDICE
1. HISTRICO E PRIMEIROS EXEMPLOS .................................................................................... 3 1.1 Ambiente do Visual Studio ................................................................................................. 3 2. MTODOS DE PROGRAMA EM C#........................................................................................... 5 2.1 Mtodos da classe Math...................................................................................................... 5 3. CONCEITOS DE POO .................................................................................................................. 5 3.1 Encapsulamento, Atributos e mtodos, Ocultao da informao........................................ 5 3.2 Modificadores de Acesso (public e private) ........................................................................ 7 3.3 Construtores ....................................................................................................................... 7 3.4 Utilizao de SETs e GETs / Propriedades ..................................................................... 10 3.5 Composio: referncias a objetos como variveis de instncia de outras classes.............. 11 3.6 Usando a referncia THIS................................................................................................. 13 4. HERANA.................................................................................................................................. 14 5. TRABALHO DE HERANA...................................................................................................... 18 6. POLIMORFISMO ....................................................................................................................... 23 6.1 converso de objetos da classe derivada para objetos da classe base.................................. 23 6.2 Classes Abstratas.............................................................................................................. 24 6.3 Interface ........................................................................................................................... 28 7. EXCEO .................................................................................................................................. 29 7.1 DivideByZeroException ................................................................................................... 29 7.2 Criando uma classe separada para tratamento da Exceo................................................. 30 7.3 Testando estouros com os operadores CHECKED e UNCHECKED................................. 31 8. CONTROLES/COMPONENTES VISUAIS SIMPLES ............................................................... 32 8.1 Label, Textbox e Button ................................................................................................... 32 8.2 Groupbox e Panel ............................................................................................................. 32 8.4. Controle Com Guias (TabControl)................................................................................... 33

Programao Orientada a Objetos C# 1. HISTRICO E PRIMEIROS EXEMPLOS O C# tem razes em C, C++ e Java. Trata-se de uma linguagem visual dirigida por eventos e total/ee orientada a objetos. A Microsoft sabedora das necessidades do mercado para : Aplicativos baseados na Web Ferramentas de programao para dispositivos eletrnicos mveis (por ex telefones celulares) Para atender essas necessidades a Microsoft anunciou sua iniciativa .NET (dot.net ou ponto.net) em junho de 2000. A plataforma .NET possibilita que os aplicativos baseados na Web possam ser distribudos para uma grande variedade de dispositivos (at telefones celulares) e p/computadores de mesa. Ela independente de uma linguagem, permitindo que os programadores criar aplicativos em uma linguagem compatvel com essa tecnologia (cdigo nas linguagens .NET compreendem C#, Visual C++.NET, Visual Basic.NET Java, JScript, Pascal, Perl entre outras) 1.1 Ambiente do Visual Studio Solution Explorer: lista todos os arquivos da soluo. Quando o Visual Studio carregado, o solution explorer est vazio. Quando um novo projeto criado, o solution explorer exibe o contedo desse projeto. ToolBox (caixa de ferramentas): os programadores podem arrastar e soltar controles em um formulrio. Existem grupos de componentes relacionados (Common Controls, Containers, Data, Components, Windows Forms). Janela Properties: Permite a manipulao das propriedades do controle. Na ilustrao abaixo, mostra as propriedades do FORM. A coluna da direita mostra seus valores atuais. O cone EVENTS permite que o controle ou formulrio responda a certas aes do usurio.

Programao Orientada a Objetos C# 1o. exemplo) Imprimindo uma linha de texto using System; // acrescentando biblioteca class Primeiro
{

static void Main (string[] args)


{

Console.WriteLine(Inicio da programao com C#);


string pausa = Console.ReadLine();
} /* comentario } */

2o. exemplo) Exibindo uma caixa de texto using System; // acrescentando biblioteca using System.Windows.Forms; class Segundo
{

static void Main (string[] args)


{

MessageBox.Show(Inicio da programao com C# \n parte 2);


} /* comentario } */

3. Exemplo) Somando dois nmeros using System; // acrescentando biblioteca class SomaNumeros
{

static void Main (string[] args)


{

string primeiroNumero, segundoNumero; int num1, num2, soma; Console. Write( favor entre com primeiro numero inteiro: ); primeiroNumero = Console.ReadLine(); Console. Write( favor entre com segundo numero inteiro: ); segundoNumero = Console.ReadLine(); num1 = Int32.Parse(primeiroNumero); num2 = Int32.Parse(segundoNumero); soma = num1 + num2; Console.WriteLine(\n A soma eh {0 } , soma); Console.WriteLine (\nOs nmeros foram {0} e {1} ,num1, num2);
string pausa = Console.ReadLine();
} /* comentario } */

Operador ( ) parnteses * / ou % + ou -

Precedncia 1. 2. 3

== != > < >= <=

Igualdade Diferente Maior Menor Maior igual Menor igual

Faa um algoritmo para ler as notas de 10 alunos. Calcular a mdia da classe.

Programao Orientada a Objetos C# using System; // acrescentando biblioteca class MediaClasse


{

static void Main (string[] args)


{

int media, somaTotal, contador, nota; somaTotal = 0; contador = 1; while (contador <= 10) { Console. Write( entre com a nota do aluno: ); nota = Int32.Parse(Console.ReadLine()); somaTotal = somaTotal + nota; contador = contador + 1; } media = somaTotal / 10; Console. WriteLine( \n\nMedia da classe = {0} , media);
string pausa = Console.ReadLine();
} /* comentario } */

2. MTODOS DE PROGRAMA EM C#

double

2.1 Mtodos da classe Math Console.WriteLine( Math.Sqrt(900.0)); // resultado = 30.0 (doubl) Console.WriteLine ( Math.PI ); // exibe 3,14159265358979323846 Cos (x ) Pow (x, y) Sin (x ) Sqrt ( x ) Tan ( x ) Floor ( x ) Ceiling (x ) Cos (0.0) 1.0 X elevado a y Pow (2,3) = 23 = 8

Arredonda x para o maior inteiro no maior que x Floor (9.2) = 9.0 Arredonda x para o menor inteiro no menor do que x Ceiling (9.2) = 10.0

3. CONCEITOS DE POO 3.1 Encapsulamento, Atributos e mtodos, Ocultao da informao A orientao a objetos usa classes para encapsular (isto reunir) dados (atributos) e mtodos (comportamentos). Os objetos tem capacidade de ocultar sua implementao de outros objetos (esse princpio chamado de ocultamento de informaes). Embora alguns objetos possam se comunicar uns com os outros, por meio de interfaces bem definidas (assim como a interface do motorista com um carro inclui um volante, pedal acelerador,

Programao Orientada a Objetos C# pedal de freio e cambio), os objetos no sabem como os outros so implementados (assim como o motorista no sabe como o volante, o motor, o freio, e os mecanismos de transmisso so implementados). Em geral dos detalhes da implementao ficam ocultos dentro dos prprios objetos. Certamente possvel dirigir um carro sem conhecer os detalhes do funcionamento dos motores, das transmisses e dos sistemas de escape. Em linguagens de programao procedimentais (como C) a programao tende a ser orientada a aes. A programao C#, entretanto orientada a objetos. Em C, a unidade de programao a funo (as funes so chamadas de mtodos em C#). Em C#, a unidade de programao a classe. Os objetos so eventualmente instanciados (isto , criados) dessas classes, e as funes so encapsuladas dentro dos limites das classes como mtodos. Os programadores de C se concentram na escrita de funes. Eles agrupam em uma funo aes que executam alguma tarefa e, ento agrupam as funes para formar um programa. Certamente, os dados so importantes em C, mas eles existem principalmente para suportar as aes que as funes executam. Os verbos (calcule, verifique, busque) em um documento de requisitos de um sistema descrevendo os requisitos de um novo aplicativo, ajudam o programador de C a determinar o conjunto de funes que trabalharo juntas para implementar o sistema. Em contraste, os programadores C# se concentram na criao de seus prprios tipos definidos pelo usurio, chamados classes. Tambm nos referimos as classes como tipos definidos pelo programador. Cada classe contem dados e um conjunto de mtodos que manipulam dados. Os componentes de dados ou membros de dados de uma classe so chamados de variveis de instancia. Em C#, a ateno focalizada nas classes, em vez de mtodos. Os substantivos em um documento de requisitos (pessoa, funcionrio, aluno, livro) ajudam o programador de C# a determinar um conjunto inicial de classes com as quais vai comear o processo de projeto.
class VerificaTriangulo { int a, b, c; public VerificaTriangulo(int va,int vb,int vc) { a = va; b = vb; c = vc; } public bool verificaFormacao() { if ((a < b + c)&&(b < a+c)&&(c < a + b)) return true; else return false; } public int verificaTipo() { if (verificaFormacao()) { if ((a == b) && (b == c)) return 1; //equuilatero else if ((a != b) && (b != c) && (c != a)) return 2; //escaleno else return 3; //isosceles } else return -1; //no eh triangulo } public override string ToString() { string temp; switch (verificaTipo()) { case 1: temp = "Equilatero"; break;

Programao Orientada a Objetos C#


case 2: temp = "Escaleno"; break; case 3: temp = "Isosceles"; break; case -1: temp = "Nao forma triangulo"; break; } return temp; } } Interface (FORM) ligao com a classe VerificaTriangulo namespace Triangulo
{

public partial class Form1 : Form


{

public Form1() { InitializeComponent(); } private void bVerifica_Click(object sender, EventArgs e) { try { int a = Int32.Parse(tbA.Text); int b = Int32.Parse(tbB.Text); int c = Int32.Parse(tbC.Text); VerificaTriangulo TR = new VerificaTriangulo(a, b, c); lSaida.Text = TR.ToString(); } catch (Exception erro) { MessageBox.Show("entre com os valores primeiramente...");
} } }

3.2 Modificadores de Acesso (public e private) As 3 variveis de instncia Hora, Minuto e Segundo foram declaradas com o modificador de acesso PRIVATE, indicando que essas variaveis de instancia so acessveis apenas para membros da classe isso conhecido como ocultamento de dados. Isto indica que apenas os mtodos dentro da classe conseguem enxergar as variveis de instancia Hora,Minuto e Segundo. Normalmente, as variveis de instancia so declaradas como PRIVATE e os mtodos como PUBLIC. possvel declarar de outra forma tambm (variveis de instancia PUBLIC e/ou mtodos PRIVATE, conhecidos por serem mtodos utilitrios, usados s dentro da prpria classe). 3.3 Construtores Os constructores de uma classe podem ser sobrecarregados. O C# chama o constructor apropriado fazendo corresponder o nmero, tipos e ordem dos argumentos especificados na chamada do constructor com o nmero, tipos e ordem dos parmetros especificados em cada definio do constructor.

Programao Orientada a Objetos C#

namespace Tempo { class ClasseTempo { private int hora; // de 0 a 23 private int minuto; // de 0 a 59 private int segundo; // de 0 a 59 public ClasseTempo() // constructor { SetTempo(0, 0, 0);//meia-noite } public ClasseTempo(int hora) // constructor so com hora { SetTempo(hora, 0, 0); } public ClasseTempo(int hora, int minuto) // constructor so com minuto { SetTempo(hora, minuto, 0);
} public ClasseTempo(int hora, int minuto, int segundo)// constructor so c/segundo { SetTempo(hora, minuto, segundo); } public ClasseTempo(ClasseTempo tempo)// constructor c/um tempo anterior { SetTempo(tempo.hora, tempo.minuto, tempo.segundo); } public void SetTempo(int valorHora, int valorMinuto,int valorSegundo) { hora = (valorHora >= 0 && valorHora < 24) ? valorHora : 0; minuto = (valorMinuto >= 0 && valorMinuto < 60) ? valorMinuto : 0; segundo = (valorSegundo >= 0 && valorSegundo < 60) ? valorSegundo : 0; } // converte a hora para uma string no formato de hora universal (24 horas) public string ToUniversalString() { // formato D2 =formato de numero digital base 10 - de dois digitos return String.Format("{0:D2}:{1:D2}:{2:D2}", hora, minuto, segundo); } public string ToAmericanoString() { return String.Format("{0}:{1:D2}:{2:D2} {3}", ((hora == 12 || hora == 0) ? 12 : hora % 12), minuto, segundo, (hora < 12 ? "AM" : "PM"));
} } }

Programao Orientada a Objetos C#

Ligando a interface (Form) com a classe ClasseTempo namespace Tempo { public partial class Form1 : Form { ClasseTempo T = new ClasseTempo(); public Form1() { InitializeComponent(); }

private void bVerifica_Click(object sender, EventArgs e) { int h, m, s; if ((tbHora.Text == "")&&(tbMinuto.Text=="")&&(tbSegundo.Text=="")) T = new ClasseTempo();//meia noite else if ((tbHora.Text!= null)&&(tbMinuto.Text=="")&&(tbSegundo.Text=="")) { h = Int32.Parse(tbHora.Text); T = new ClasseTempo(h, 0, 0);//so hora } else if ((tbHora.Text !="")&&(tbMinuto.Text != "")&&(tbSegundo.Text=="")) { h = Int32.Parse(tbHora.Text); m = Int32.Parse(tbMinuto.Text); T = new ClasseTempo(h, m, 0); //hora+minuto } else// todos diferentes de null { h = Int32.Parse(tbHora.Text); m = Int32.Parse(tbMinuto.Text); s = Int32.Parse(tbSegundo.Text); T = new ClasseTempo(h, m, s); } string temp = "Americano=" + T.ToAmericanoString() + "\n" + "Universal=" + T.ToUniversalString(); lSaida.Text = temp; } private void Form1_Load(object sender, EventArgs e) { tbHora.Clear(); tbMinuto.Clear(); tbSegundo.Clear(); } private void bValida_Click(object sender, EventArgs e) { ClasseTempo tempo1 = new ClasseTempo();//00:00:00 ClasseTempo tempo2 = new ClasseTempo(2);//02:00:00 ClasseTempo tempo3 = new ClasseTempo(21, 34);//21:34:00 ClasseTempo tempo4 = new ClasseTempo(12, 25, 42);//12:25:42 ClasseTempo tempo5 = new ClasseTempo(27, 74, 99);//00:00:00 invalido ClasseTempo tempo6 = new ClasseTempo(tempo4);//12:25:42 string saida; saida = "Constructores utilizados: " + "\nTempo1: todos argumentos so default" + "\n " + tempo1.ToUniversalString() + "\n " + tempo1.ToAmericanoString(); saida += "\nTempo2: hora especifica, minutos e segundos so default" +

Programao Orientada a Objetos C#


"\n " + tempo2.ToUniversalString() + "\n " + tempo2.ToAmericanoString(); saida += "\nTempo3: especificos Hora e minutos, segundos so default" + "\n " + tempo3.ToUniversalString() + "\n " + tempo3.ToAmericanoString(); saida += "\nTempo4: especificos Hora, minutos e segundos" + "\n " + tempo4.ToUniversalString() + "\n " + tempo4.ToAmericanoString(); saida += "\nTempo5: tempo com Hora, minutos e segundos invalidos" + "\n " + tempo5.ToUniversalString() + "\n " + tempo5.ToAmericanoString(); saida += "\nTempo6: tempo setado com o Tempo4" + "\n " + tempo6.ToUniversalString() + "\n " + tempo6.ToAmericanoString(); lTeste.Text = saida; } } }

3.4 Utilizao de SETs e GETs / Propriedades


Os mtodos de uma classe odem manipular variveis de instancia private desta classe. Suponha uma classe ContaBancaria que tenha uma varivel de instancia private SALDO. Um mtodo para alterar o saldo seria CalcularTaxadeJuros, por exemplo. Frequentemente, as classes fornecem PROPRIEDADES public para permitir aos clientes configurarem (isto , atriburem valores as) ou obterem (isto , obterem os valores de) variveis de instncia Private. Por exemplo, no exemplo abaixo temos trs propriedades Hora, Minuto e Segundo que acessam as variveis de instancia hora, minuto e segundo respectivamente. Cada propriedade tem um acessor GET (para recuperar o valor do campo) e um acessor SET (para modificar o valor do campo). Se uma varivel de instancia private, um acessor get public parece permitir que outros mtodos leiam os dados a vontade. Entretanto, o acessor get pode controlar a formatao e exibir os dados. Um acessor set public pode investigar tentativas de modificar o valor da varivel de instancia, garantindo assim que o novo valor seja apropriado para a varivel de instancia. Por exemplo, uma tentativa de configurar (set) o dia do ms como 37 seria rejeitada, e uma tentativa de configurar o peso de uma pessoa com um valor negativo tambm seria rejeitada. Assim, os acessores set e get podem fornecer acesso a dados private, mas a implementao desses acessores controla o que o cdigo cliente pode fazer com os dados.
class VerificaTriangulo { int a, b, c; public int A { get { return a; } set { a = (value >=0)? value : 1; } } public int B { get { return b; } set { b = (value >=0)? value : 1; } } public int C { get { return c; } set { c = (value >=0)? value : 1; } } public VerificaTriangulo(int va,int vb,int vc) { A = va; B = vb; C = vc; }

10

Programao Orientada a Objetos C#


public bool verificaFormacao() { if ((A < B + C) && (B < A + C) && (C < A + B)) return true; else return false; } public int verificaTipo() { if (verificaFormacao()) { if ((A == B) && (B == C)) return 1; //equuilatero else if ((A != B) && (B != C) && (C != A)) return 2; //escaleno else return 3; //isosceles } else return -1; //no eh triangulo } public override string ToString() { string temp = ""; switch (verificaTipo()) { case 1: temp = "Equilatero"; break; case 2: temp = "Escaleno"; break; case 3: temp = "Isosceles"; break; case -1: temp = "Nao forma triangulo"; break; } return temp; } }

3.5 Composio: referncias a objetos como variveis de instncia de outras classes Hierarquia de Agregao/decomposio Agregao - Um objeto pode ser visto como um agregado de outros objetos (suas partes). Por exemplo, numa casa tpica, pode-se visualizar vrias objetos que a compem, a exemplo do diagrama que se segue:

Este diagrama mostra que um objeto casa composto por vrios outros objetos. A relao entre uma casa e suas partes componentes pode ser lida como: - uma casa < composta por> .. - ma casa < um agregado de> - uma casa < decomposta em> ...

11

Programao Orientada a Objetos C# e apresenta uma viso todo -> parte, ou seja, do objeto mais complexo para as partes que o compe. Uma mudana rpida de perspectiva possibilita um outro tipo de afirmaes: o endereo < parte da> casa os mveis <so parte da> casa

Exemplo: Classe Datas Classe Empregado Classe TestaEmpregado(main) A classe DATE encapsula informaes relacionadas a uma data especfica. A classe EMPREGADO encapsula o nome do funcionrio e dois objetos DATE representando a data de nascimento e de contratao do funcionrio. A classe TestaComposio cria um objeto da classe Empregado para demonstrar a composio O uso de referncias a objetos de classes j existentes, como membros de novos objetos, chamado de composio (ou agregao). Classe DATE
using System; public class Date { private int mes; // de 1 a 12 private int dia; // 1 a 31 private int ano; // qq ano public Date(int d, int m, int a) { if (m > 0 && m <= 12) mes = m; else { mes = 1; Console.WriteLine("mes {0} invalido. setado como mes 1", m); } ano = a; dia = verificaDia(d); }// constructor Date

Classe Empregado
using System; public class Empregado { private string nome; private Date niver; private Date contratacao; public Empregado(string n, int dn,int mn, int an, int dc,int mc, int ac) { nome = n; niver = new Date(dn, mn, an); contratacao = new Date(dc, mc, ac); }// constructor Empregado public string ToEmpregadoString() { return nome + " nasceu em " + niver.ToDateString() + "\n foi contratado em " + contratacao.ToDateString(); } }// class Empregado

12

Programao Orientada a Objetos C# Classe TestaComposio


using System; using System.Windows.Forms; public class TestaComposicao { static void Main(string[] args) { Empregado e = new Empregado("Joao da Silva", 10, 10, 1980, 05, 06, 2005); MessageBox.Show(e.ToEmpregadoString(), "Testtando classe empregado"); } }// class testaComposicao

3.6 Usando a referncia THIS


Todo objeto pode acessar uma referncia a si mesmo, chamada de referncia THIS. A referncia THIS pode se referir implicitamente as variveis de instancia, propriedades e mtodos de um objeto. A palavrachave THIS normalmente usada dentro de mtodos, onde THIS uma referncia ao objeto em que o mtodo esta executando operaes.
using System; public class Tempo4 { private int hora; private int minuto; private int segundo; public Tempo4(int hora, int minuto, int segundo) { this.hora = hora; this.minuto = minuto; this.segundo = segundo; } public string ConstroiString() { return "this.ToIniciaString(): " + this.ToIniciaString() + "\n sem ToIniciaString(): " + ToIniciaString(); } public string ToIniciaString() { return String.Format("{0}:{1:D2}:{2:D2} {3}", ((this.hora==12 || this.hora==0)?12: this.hora%12),this.minuto, this.segundo, (this.hora <12? "AM":"PM"));
} } using System; using System.Windows.Forms;

class TestaTHIS { static void Main(string[] args) { Tempo4 tempo = new Tempo4(12,30,19); MessageBox.Show(tempo.ConstroiString(), "Demosntrando o \"this\" referencia"); } }

13

Programao Orientada a Objetos C#

4. HERANA A herana uma forma de reutilizao de software em que as classes so criadas pela absoro dos dados e comportamentos de uma classe j existente e aprimorando-as com novos recursos. Ao criar uma classe, em vez de escrever variveis de instancia e mtodos completamente novos, o programador pode indicar que a nova classe deve herdar as variveis de classe, propriedades e mtodos de outra classe. A classe anteriormente definida chamada classe base ou super classe, e a nova classe referida como classe derivada. Uma classe derivada, na qual variaveis de instancia, propriedades, e mtodos exclusivos so normalmente adicionados, frequentemente maior do que a sua classe base. Fazemos uma distino entre o relacionamento -um e o relacionamento tem-um. -UM representa herana . Em um relacionamento UM , um objeto de uma classe derivada tambm pode ser tratado como um objeto de sua classe base. Por exemplo, um carro um veculo. Em contraste, tem-um significa composio. No relacionamento tem-um, um objeto da classe contm uma ou mais referncias de objeto como membros. Por exemplo, um carro tem um volante. Um problema de herana que uma classe derivada pode herdar propriedades e mtodos que no precisa ou que no deve ter. responsabilidade do projetista da classe garantir que os recursos fornecidos por uma classe sejam apropriados para as futuras classes derivadas. Mesmo quando a propriedade ou mtodo de uma classe base apropriada para uma classe derivada, essa classe derivada frequentemente exige que a propriedade ou mtodo realize sua tarefa de maneira especifica para a classe derivada. Em tais casos, a propriedade ou o mtodo da classe base pode ser sobreposto (overriden, redefinida) na classe derivada, com uma implementao apropriada. Ponto

Circulo

Cilindro

Circulo rea= r 2 Cilindro rea = ( r 2) + ( 2 r h ) onde h a altura


using System; // a definio da classe Ponto herda impliciatamente de Object public class Ponto { private int x, y; public Ponto() { // a chamada implicita ao constructor de Object ocorre aqui } public Ponto(int xvalor,int yvalor)

14

Programao Orientada a Objetos C#


{ X = xvalor; Y = yvalor; } public int X { get { return x; } set { x = value;} } public int Y { get { return y; } set { y = value; }
}

// toda classe em C# herda da classe System.Object // isto significa que ela herda 8 mtodos padro da classe Object // o mtodo ToString da classe Ponto sobrepe o metodo ToString original da classe Object public override string ToString() { return "["+x+", "+y+"]";
} }

using System; class circulo : Ponto { private double raio; public circulo() { // chamada implicita ao contrsuctor de Ponto ocorre aqui } public circulo(int xvalor, int yvalor,double r): base(xvalor,yvalor) { // chamada implicita ao contrsuctor de Ponto ocorre aqui Raio = r;
}

public double Raio { get { return raio; } set { if (raio>=0) raio = value; }
}

public double Diametro() { return raio * 2; } public double Circunferencia() { return Math.PI * Diametro(); } public virtual double Area() //essa palavra chave permite que as classes derivadas //sobreponham um metodo da classe base

15

Programao Orientada a Objetos C#


{ return Math.PI * Math.Pow(raio, 2); } public override string ToString() { return "Centro= ["+base.ToString()+"\nRaio= "+raio;
} }

using System; class Cilindro: circulo { private double altura; public Cilindro() { } public Cilindro(int xvalor, int yvalor, double r, double alt) : base(xvalor, yvalor, r) { Altura = alt; } public double Altura { get { return altura; } set { if (value >= 0) altura = value; } } public override double Area() { return 2 * base.Area() + base.Circunferencia() * Altura; } public double Volume() { return base.Area() * Altura; } public override string ToString() { return base.ToString() + "\n Altura "+Altura; } }// fim da classe cilindro using System; using System.Windows.Forms; public class TestaPonto { public static void Main(string[] args) { /*Ponto p = new Ponto(72,118); string saida = "Coordenada X = " + p.X + "\n" + "Coordenada Y = " + p.Y; p.X = 10; p.Y = 10; saida += "\n\nA nova localizao do ponto = " + p; // note aqui a chamada ao ToString MessageBox.Show(saida, "demonstrao da classe ponto");

16

Programao Orientada a Objetos C#


*/ //==================================================================== /*circulo c = new circulo(37,43,2.5); string saida = "Coordenada X = " + c.X + "\n" + "Coordenada Y = " + c.Y+ "\n Raio = "+c.Raio; c.X = 2; c.Y = 2; c.Raio = 4.25; saida += "\n\n" + "Nova localizao e raio do circulo = " + "\n" + c + "\n"; saida += "Diametro = " + String.Format("{0:F}", c.Diametro()) + "\n"; saida += "Circunferencia = " + String.Format("{0:F}", c.Circunferencia()) + "\n"; saida += "Area = " + String.Format("{0:F}",c.Area()) + "\n"; MessageBox.Show(saida, "demonstrao da classe circulo"); */ //=================================================================== Cilindro cil = new Cilindro(12,23,2.5,5.7); string saida = "Coordenada X = " + cil.X + "\n" + "Coordenada Y = " + cil.Y + "\n Raio = " + cil.Raio + "\n"+ "Altura = "+cil.Altura; cil.X = 2; cil.Y = 2; cil.Raio = 4.25; cil.Altura = 10; saida += "\n\n" + "Nova localizao: raio e altura do cilindro = " + "\n" + cil + "\n"; saida += "Diametro = " + String.Format("{0:F}", cil.Diametro()) + "\n"; saida += "Circunferencia = " + String.Format("{0:F}", cil.Circunferencia()) + "\n"; saida += "Area = " + String.Format("{0:F}", cil.Area()) + "\n"; saida += "Volume = " + String.Format("{0:F}", cil.Volume()) + "\n"; MessageBox.Show(saida, "demonstrao da classe cilindro"); } }

17

Programao Orientada a Objetos C#

5. TRABALHO DE HERANA Observaes: - o mtodo CalculaSalrio tem que ser refeito a


cada especializao - o mtodo toString tem que ser refeito a cada especializao, mas deve-ser aproveitado a implementao da classe Base imediata (acima) - novos mtodos podem ser acrescentados ao projeto, conforme a necessidade - Utilizar variveis de instncia com modificadores PRIVATE somente. - Cada classe tem suas propriedades

Empregado
Matrcula Nome SalarioBruto SalarioLiquido DataAdmisso Constructor sem args Constructor com args Propriedades ToString

DATAS Dia, ms, ano

Operador Britadeira Insalubridade Constructor sem args Constructor com args CalculaSalario ToString propriedades

Constructor sem args Constructor com args ToString Propriedades verifica() getData() bissexto()

Tcnico de Explosivos Adicional Periculosidade Constructor sem args Constructor com args CalculaSalario ToString propriedades

18

Programao Orientada a Objetos C# CLASSE DATAS


using System; public class datas { private int dia, mes, ano; public datas() { dia = 0; mes = 0; ano = 0; } public datas(int d, int m, int a) { Dia = d; Mes = m; Ano = a; verifica(); } public int bissexto() // se = 0 e bissexto, caso contrario nao eh { if (((ano % 4 == 0) && (ano % 100 > 0)) || (ano % 400 == 0)) return 0; else return 1; } public int Dia { set { dia = value; } get { return dia; } } public int Mes { set { mes = value; } get { return mes; }
}

public int Ano { set { ano = value; } get { return ano; }


}

public void verifica() { int[] dmes={0,31,28,31,30,31,30,31,31,30,31,30,31}; ano = ano > 0 ? ano:1; dmes[2] = dmes[2]+bissexto(); mes = mes > 0 && mes < 13 ? mes:1; dia = dia > 0 && dia <= dmes[mes] ? dia:1;
} // fecha verifica

public String getData() { verifica(); string[] nomes= {"zero", "Janeiro","Fevereiro","Marco", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro","Dezembro"}; string temp = dia+"/"+nomes[mes]+"/"+ano; return (temp); } }// classe datas

19

Programao Orientada a Objetos C#


CLASSE EMPREGADO using System; public class empregado { // variaveis de instancia private string matricula; private string nome; private double salarioLiquido; private double salarioBruto; private datas dataAdm; // metodos public empregado() { nome = ""; matricula = ""; salarioLiquido = 0.0; salarioBruto = 0.0; dataAdm = new datas(); } public empregado(string n, string matr, double sal, int da, int ma, int aa) { Nome = n; Matricula = matr; SalarioBruto = sal; salarioLiquido = 0.0; dataAdm = new datas(da, ma, aa); } public string Matricula { get { return matricula;} set { matricula = value;} } public string Nome { get { return nome;} set { nome = value;} } public double SalarioBruto { get { return salarioBruto;} set { salarioBruto = (value >= 0)? value: 0;} } public double SalarioLiquido { get { return salarioLiquido;} set { salarioLiquido = (value >= 0)? value: 0;} } public void setAdmissao(int d, int m, int a) { dataAdm.Dia = d; dataAdm.Mes = (m); dataAdm.Ano = (a); }

20

Programao Orientada a Objetos C#


public override string ToString() { string temp = "\n\nMatricula= " + Matricula + " Nome= " + Nome + " Salario Bruto= " + SalarioBruto; return (temp); } public virtual void calculaSalario() { salarioLiquido = salarioBruto; } } // fecha classe empregado CLASSE OPERADOR DE BRITADEIRA using System; public class operadorBritadeira : empregado { // variaveis de instancia private double insalubridade; // metodos public operadorBritadeira(): base() { Insalubridade=0; } public double Insalubridade { get { return insalubridade;} set { insalubridade = (value >= 0)? value: 0;} } public operadorBritadeira(String n, String matr, double sal, int da,int ma, int aa,double insalub) : base(n,matr,sal,da,ma,aa) { Insalubridade = insalub; } public override void calculaSalario() { SalarioLiquido = SalarioBruto+Insalubridade; } public override String ToString() { String temp = "\n"+base.ToString()+ String.Format("\n Insalubridade= "+Insalubridade); return (temp); } }// fecha classe operadorBritadeira CLASSE TECNICO DE EXPLOSIVO using System; public class tecnicoExplosivo : operadorBritadeira { // variaveis de instancia private double periculosidade; // metodos

21

Programao Orientada a Objetos C#


public tecnicoExplosivo(): base () { Periculosidade=0; } public tecnicoExplosivo(string n, string matr, double sal, int da,int ma, int aa,double insalub, double pericul) : base (n,matr,sal,da,ma,aa,insalub) { Periculosidade = pericul; } public double Periculosidade { get { return periculosidade;} set { periculosidade = (value >= 0)? value: 0;} } public override void calculaSalario() { SalarioLiquido = SalarioBruto+Insalubridade+Periculosidade; public override string ToString() { string temp = "\n"+base.ToString()+ String.Format(" Periculosidade="+Periculosidade); return (temp); } }// fecha classe tecnicoExplosivo }

PRINCIPAL Testa HERANA


public class TestaHeranca { static void Main(string[] args) { Console.WriteLine("\nTestando Heranca Empregado Tecnico Operador"); empregado e = new empregado("joao", "1234",4000, 10, 12, 2002); e.calculaSalario(); string temp= "\n\nEmpregado Comum "+e.ToString()+" Liquido="+e.SalarioLiquido; Console.WriteLine(temp); string pausa = Console.ReadLine(); operadorBritadeira op = new operadorBritadeira("operadTil", "2345", 1300, 13, 08, 2002, 500); op.calculaSalario(); temp = "\n\nOperador Britadeira " + op.ToString()+" Liquido="+op.SalarioLiquido; Console.WriteLine(temp); pausa = Console.ReadLine(); tecnicoExplosivo te = new tecnicoExplosivo("exploso ", "2345", 1300, 13, 08, 2002, 500,450); te.calculaSalario(); temp = "\n\nTecnico Explosivo " + te.ToString()+ " Liquido="+te.SalarioLiquido; Console.WriteLine(temp); pausa = Console.ReadLine();
} }

===============================================================

22

Programao Orientada a Objetos C# 6. POLIMORFISMO O polimorfismo nos permite escrever programas que tratam uma ampla variedade de classes relacionadas de uma maneira genrica e facilita a adio de novas classes e recursos em um sistema. Os programas podem processar objetos de todas as classes genericamente em uma hierarquia de classes, como objetos de uma classe base comum. Alem disso, novas classes podem ser adicionadas com pouca ou nenhuma modificao nas partes genricas do programa. Polimorfismo ocorre quando uma subclasse tem um mtodo com a mesma assinatura da superclasse (classe base), ou seja, contm a mesma assinatura. Assinatura significa nmero, tipo e ordem dos parmetros. Polimorfismo tambm definido da seguinte forma: Trata-se da criao de uma famlia de funes (mtodos) que compartilham do mesmo nome, mas cada uma tem cdigo independente. 6.1 converso de objetos da classe derivada para objetos da classe base
using System; class Ponto
{

private int x, y; public Ponto()


{ }

public Ponto(int xValor, int yValor)


{ X = xValor; Y = yValor; }

public int X { get { return x; } set { x = value; }


}

public int Y { get { return y; } set { y = value; }


}

public override string ToString() { return "["+X+", "+Y+"]";


} }

using System; class Circulo: Ponto


{

private double raio; public Circulo()


{ }

public Circulo(int xValor, int yValor, double r) : base(xValor, yValor)


{ raio = r; }

public double Raio { get { return raio; } set { raio = ((value > 0) ? value : 1); }
}

23

Programao Orientada a Objetos C#


public double Diametro() { return raio * 2;
}

public double circunferencia() { return Math.PI * Diametro();


}

public virtual double Area() { return Math.PI * Math.Pow(raio, 2);


}

public override string ToString() { return "Centro= "+base.ToString()+"; Raio= "+Raio;


} }

using System; using System.Windows.Forms; class testaConversao { static void Main(string[] args) { Ponto p = new Ponto(30, 50); Circulo c = new Circulo(120, 89, 2.7); string saida = "Ponto p " + p.ToString() + "\nCirculo c " + c.ToString(); //relacionamento -um para atribuir circulo c ao um objeto Ponto Ponto p2 = c; saida += "\nCirculo foi atribuido ao Ponto p2 " + p2.ToString(); //converte ponto p2 novamente para circulo c2 Circulo c2 = (Circulo)p2;
saida += "\nPonto p2 (que era circulo) volta a origem circulo c2 " + c2.ToString();

saida += "\nArea de circulo c2 " + c2.Area().ToString("F"); if (p is Circulo)


{

c2 = (Circulo)p; saida += "\n\nCast realizado com sucesso";


}

else saida += "\n\nPonto p no um circulo"; MessageBox.Show(saida, "Demonstrativo do Relacionamento -um");


} }

6.2 Classes Abstratas Existem casos em que interessante definir classes para as quais o programador nunca pretende instanciar quaisquer objetos. Tais classes so chamadas classes abstratas. Essas classes no podem ser usadas para instanciar objetos, pois as classes abastratas so incompletas. As classes derivadas devem definir as partes faltantes. As classes abstratas contem um ou mais mtodos abstratos ou

24

Programao Orientada a Objetos C# propriedades abstratas, que so mtodos e propriedades que no fornecem implementao. As classes a partir das quais objetos podem ser instanciados so chamados de classes concretas.

using System;

public abstract class Figura


{ //retorna a area da figura public virtual double Area() { return 0; } //retorna o volume da figura public virtual double Volume() { return 0; } public abstract string Nome { get;//as classes derivadas devem implementar essa propriedade //para se tornar classes concretas } }

public class Ponto: Figura


{ private int x, y; public Ponto() { } public Ponto(int xValor, int yValor) { X = xValor; Y = yValor; } public int X { get { return x; } set { x = value; } } public int Y { get { return y; } set { y = value; } } public override string ToString() { return "[" + X + ", " + Y + "]"; } public override string Nome { get { return " Ponto "; } }

25

Programao Orientada a Objetos C#


}

public class Circulo: Ponto


{ private double raio; public Circulo() { } public Circulo(int xValor, int yValor, double r) : base(xValor, yValor) { raio = r; } public double Raio { get { return raio; } set { raio = ((value > 0) ? value : 1); } } public double Diametro() { return raio * 2; } public double Circunferencia() { return Math.PI * Diametro(); } public override double Area() { return Math.PI * Math.Pow(raio, 2); } public override string ToString() { return "Centro= "+base.ToString()+"; Raio= "+Raio; } public override string Nome { get { return " Circulo "; } } }

public class Cilindro: Circulo


{ private double altura; public Cilindro() { } public Cilindro(int xValor, int yValor, double r,double h): base (xValor, yValor, r) { altura = h; }

26

Programao Orientada a Objetos C#


public double Altura { get { return altura; } set { altura = ((value >= 0) ? value : 0); } } public override double Area() { return 2 * base.Area() + base.Circunferencia() * Altura; } public override double Volume() { return base.Area()* Altura; } public override string ToString() { return base.ToString()+"; Altura = "+Altura; } public override string Nome { get { return " Cilindro "; } } } using System; using System.Windows.Forms;

public class testaAbstrata


{ public static void Main(string[] args) { Ponto p = new Ponto(7, 11); Circulo cir = new Circulo(22, 8, 3.5); Cilindro cil = new Cilindro(10, 10, 3.3, 10); // cria um vetor vazio de Figuras Figura[] vetor = new Figura[3]; vetor[0] = p; vetor[1] = cir; vetor[2] = cil; string saida=""; foreach (Figura atual in vetor) { saida += "\n\n"+atual.Nome+": "+atual+ "\nArea= "+atual.Area().ToString("F")+ "\nVolume= "+atual.Volume().ToString("F"); } MessageBox.Show(saida,"Testando array de objetos abstratos"); } }

27

Programao Orientada a Objetos C# 6.3 Interface Interfaces especificam conjuntos de servios PUBLIC (isto , mtodos e propriedades) que as classes DEVEM implementar. Uma interface usada quando no existe nenhuma implementao padro para herdar (nenhuma varivel de instancia e nenhuma implementao de mtodo). Uma classe abstrata usada para fornecer DADOS e servios (MTODOS e PROPRIEDADES). Uma interface usada para fornecer servios SEM IMPLEMENTAO (Mtodos e Propriedades) que renem objetos dspares, que se relacionam entre si apenas por meio desta interface. public interface InterfaceIdade
{ int Idade { get; } string Nome { get; } }

using System;

public class Arvore: InterfaceIdade


{ private int aneis;// numero de //aneis no tronco da arvore public Arvore(int anoPlantado) { aneis = DateTime.Now.Year - anoPlantado; } public void AddAneis() { aneis++; } public int Idade { get { return aneis; } } public string Nome { get { return "Arvore"; } } }

public class Pessoa : InterfaceIdade


{ private string primNome; private string ultNome; private int anoNasc; public Pessoa(string pN, string uN, int ano) { primNome = pN; ultNome = uN; if (ano > 0 & ano <= DateTime.Now.Year) anoNasc = ano; else anoNasc = DateTime.Now.Year; } public int Idade { get { return DateTime.Now.Year - anoNasc; }

28

Programao Orientada a Objetos C#


} public string Nome { get { return primNome + " } } using System; using System.Windows.Forms; public class TestaInterface { public static void Main(string[] args) { Arvore tree = new Arvore(1978); Pessoa p = new Pessoa("Joao", "Pereira", 1990); InterfaceIdade[] vetor = new InterfaceIdade[2]; vetor[0] = tree; vetor[1] = p; string saida = tree + ": " + tree.Nome + "\nIdade = " + tree.Idade + "\n\n"; saida += p + ": " + p.Nome + "\nIdade = " + p.Idade + "\n\n"; foreach (InterfaceIdade atual in vetor) { saida += atual.Nome + ": Idade= " + atual.Idade + "\n"; } MessageBox.Show(saida, "Demonstrando Polimorfismo com Interface"); } }

" + ultNome; }

7. EXCEO Uma exceo uma indicao de um problema que ocorre durante a execuo de um programa. O nome exceo vem do fato de que, embora um problema possa ocorrer, ele ocorre raramente. A idia que programadores escrevam programas mais robustos, claros e mais tolerantes a falhas. 7.1 DivideByZeroException
using System; using System.Windows.Forms; public class Divisao
{

static void Main(string[] args)


{

try
{

Console.WriteLine("\n Entre com o numerador "); int numerador = Int32.Parse(Console.ReadLine()); Console.WriteLine("\n Entre com o denominador "); int denominador = Int32.Parse(Console.ReadLine()); double result = numerador / denominador; string saida = String.Format("{0:F}", result);

29

Programao Orientada a Objetos C#


MessageBox.Show(saida, "testando exceo de diviso por zero");
}

catch (FormatException) // entrada (formato) invalido


{

MessageBox.Show("vc deve entrar com 2 numeros inteiros", "formato invalido de entrada", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

catch (DivideByZeroException erroDivisao)// tentou dividir por zero


{

MessageBox.Show(erroDivisao.Message, "tentou dividir por zero", MessageBoxButtons.OK, MessageBoxIcon.Error);


} }// fim do main }// fim da classe

7.2 Criando uma classe separada para tratamento da Exceo Exemplo: Extrair a raiz quadrada de um nmero negativo
using System; class NumeroNegativoExcecao : ApplicationException { public NumeroNegativoExcecao() : base("Operacao Ilegal devido a numero negativo")
{ }

public NumeroNegativoExcecao( string mensagem) : base(mensagem)


{ }

public NumeroNegativoExcecao(string mensagem, Exception erro) : base(mensagem, erro)


{ } }

using System; using System.Windows.Forms; public class raizQuadrada


{

static void Main(string[] args)


{

try
{

Console.WriteLine("\n Entre com um numero real: "); double numero = Double.Parse(Console.ReadLine()); if (numero < 0) throw new NumeroNegativoExcecao("No permitido raiz quadrada de nro negativo"); double result = Math.Sqrt(numero); string saida = String.Format("{0:F}", result); MessageBox.Show(saida, "testando exceo raiz quadrada");
}

catch (FormatException) // entrada (formato) invalido


{

MessageBox.Show("vc deve entrar com numero inteiro positivo", "formato invalido de entrada", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

catch (NumeroNegativoExcecao erroNegativo) // tentou dividir por zero


{

30

Programao Orientada a Objetos C#


MessageBox.Show(erroNegativo.Message, "raiz quadrada de Nro Negativo no existe", MessageBoxButtons.OK, MessageBoxIcon.Error);
} }// fim do main }// fim da classe

7.3 Testando estouros com os operadores CHECKED e UNCHECKED


using System; class Overflow
{

static void Main(string[] args)


{

int numero1 = Int32.MaxValue; ;// 2.147.483.647 int numero2 = Int32.MaxValue; int soma = 0; Console.WriteLine("numero 1 {0:D} \n Numero 2: {0:D}", numero1, numero2); try
{

Console.WriteLine("\nSoma de inteiros "); soma = checked(numero1 + numero2);


}

catch (OverflowException overExcecao)


{

Console.WriteLine(overExcecao.ToString());
}

Console.WriteLine("\nSoma depois de checar a operao {0}",soma); Console.WriteLine("\nSoma de inteiros no checados "); soma = unchecked(numero1+numero2); Console.WriteLine("soma depois de operao no checada {0}",soma); string pausa = Console.ReadLine();
}// main }// Overflow

Resumo sobre Exceo: Uma exceo uma indicao de um problema que ocorre durante a execuo de um programa; O tratamento de excees permite que os programadores criem aplicaes que podem resolver excees, frequentemente permitindo que o programa continue sua execuo como se nenhum problema tivesse sido encontrado. O tratamento de excees permite que os programadores escrevam programas claros, robustos e mais tolerantes a falhas. O tratamento de excees permite que o programador remova o cdigo de tratamento de erros da linha principal da execuo do programa. Isso melhora a clareza do programa e tambm sua capacidade de modificao.

31

Programao Orientada a Objetos C# 8. CONTROLES/COMPONENTES VISUAIS SIMPLES 8.1 Label, Textbox e Button TextBox propriedades: Name: tB1 PasswordChar: * Label propriedades: Name: l1 BorderStyle: Fixed3D Autosize: false Text: vazio Button propriedades: Name: b1 Text: Mostrar Texto Evento Click do boto
private void b1_Click(object sender, EventArgs e) { l1.Text = tB1.Text; }

8.2 Groupbox e Panel GroupBox (caixas de grupo) pode exibir uma legenda Panel (painis) pode ter barra de rolagem
GroupBox propriedades: Name gB1 Text: sexo Panel propriedades: AutoScroll: padro false (se true aparece as barras de rolagem) BorderStyle: borda (padro none) outras opes Fixed3D e FixedSingle Label propriedades: RadioButton propriedades: Name: l1 e l2 Name (masculino/femino) Text: (vazio) Text (masculino/feminino) Checked: true para masculino private void feminino_CheckedChanged(object sender, EventArgs e) { l1.Text = "Feminino selecionado"; } private void masculino_CheckedChanged(object sender, EventArgs e) { l1.Text = "Masculino selecionado"; } private void bsoma_Click(object sender, EventArgs e) } { l2.Text = "boto soma"; private void bsubtrai_Click(object sender, EventArgs e) } { l2.Text = "boto subtrai"; private void bdivide_Click(object sender, EventArgs e) } { l2.Text = "boto divide";

32

Programao Orientada a Objetos C#


private void bmultiplica_Click(object sender, EventArgs e) { l2.Text = "boto multiplica"; }

Exercicio

8.4. Controle Com Guias (TabControl) Form1.cs [Design]

1 Label : posicione-o abaixo do TabControl. Mude o Name para msg 1 TabControl. Para adicionar PagPages, clique boto direito no TabControl e d ADD TAB Verifique na caixa de Propriedades se est selecionado o TabControl ou o TabPage Modifique a propriedade Text dos TabPages: Cor, Tamanho, Msg e Sobre Dentro de cada TabPage, coloque RadioButtons (mude Name e Text) Form1.cs
public partial class Form1 : Form

33

Programao Orientada a Objetos C#


{ public Form1() { InitializeComponent(); }

private void Azul_CheckedChanged(object sender, EventArgs e) { msg.ForeColor = Color.Blue; } private void Preto_CheckedChanged(object sender, EventArgs e) { msg.ForeColor = Color.Black; } private void vermelho_CheckedChanged(object sender, EventArgs e) { msg.ForeColor = Color.Red; } private void doze_CheckedChanged(object sender, EventArgs e) { msg.Font = new Font(msg.Font.Name, 12); } private void catorze_CheckedChanged(object sender, EventArgs e) { msg.Font = new Font(msg.Font.Name, 14); }

private void dezesseis_CheckedChanged(object sender, EventArgs e) { msg.Font = new Font(msg.Font.Name, 16); } private void oi_CheckedChanged(object sender, EventArgs e) { msg.Text = "Oiiiiii"; } private void tchau_CheckedChanged(object sender, EventArgs e) { msg.Text = "Tchauuuuuu"; } }// fecha class

34

Você também pode gostar