Buscar

Web Aulas e av1 e 2 programação orientada a objetos

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 38 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 38 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 38 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

1) Em uma aplicação Console na ferramenta visual studio utilizando a linguagem de 
programação C#, qual o comando correto para congelar a tela no momento da 
execução do programa? 
ReadKey() 
 
2) Assinale a alternativa correta de acordo com o texto abaixo: 
Uma característica forte das interfaces é a possibilidade de prover o mecanismo da 
orientação a objetos chamado _______ . 
O texto acima está falando de: 
d) Polimorfismo 
 
3) Assinale a alternativa correta de acordo com o texto abaixo: 
A particularidade das__________ é que as classes que as herdam, acabam sendo 
modeladas por elas, isto é, as __________ nada mais são do que modelos para a 
construção de classes, que herdam suas características. 
O texto acima está falando de: 
c) Interfaces 
 
4 ) Em C#, analise o método a seguir: 
 
d) criação de uma variável que atribua o retorno do método FormatarCpf() e 
atribuição de um valor para o atributo _Cpf 
 
5) Analise as afirmativas abaixo. 
I. As classes são abstrações de um conjunto de objetos que tem características 
similares, sendo assim, as classes definem os estados e comportamentos de um 
objeto; 
II. São considerados membros de uma casse: Construtores, Destrutores, 
Propriedades e Eventos; 
III. A classe é constituída por métodos e atributos. 
Agora assinale a alternativa correta 
 
a) As afirmativas I, II e III estão corretas 
 
 
av2 
 
1) De acordo com os conhecimentos sobre Programação Orientada a Objetos, 
assinale a alternativa correta: 
 
c) Diagrama de transição de estados é uma representação do estado ou situação em 
que um objeto pode se encontrar no decorrer da execução do sistema 
 
2) Analise o texto abaixo e marque a alternativa correta. 
Tanto a _______ quanto a _______ são mecanismos que permitem a reutilização de 
códigos, contudo, durante anos, principalmente no início da explosão da orientação 
a objetos, os programadores consideravam a _______ como sendo a ferramenta 
básica da extensão e reutilização de funcionalidades 
 
e) Herança e composição 
 
3) As associações representam o equivalente mais próximo dos relacionamentos 
utilizados no modelo Entidade-Relacionamento, ou seja, seu objetivo é definir a 
maneira como as classes estão unidas e se relacionam entre si, compartilhando 
informações – (Guedes, 2006, p. 72) 
Considerando o relacionamento de agregação, analise as alternativas abaixo e 
assinale a correta. 
 
d) Agregação é um agregado de membros em que o objeto parte faz sentido mesmo 
sem o objeto todo 
 
4) Sobre parâmetros de entrada em métodos, podemos afirmar que: 
Assinale a alternativa correta. 
 
d) São valores que serão obrigatórios na chamada do método 
 
5) Assinale a alternativa correta de acordo com o texto abaixo: 
A _______ não necessita de uma programação complexa, pois em outras palavras, 
não há diferença entre _______ e um simples relacionamento "uses" em UML. 
O texto acima está falando de: 
 
e) Agregação 
 
 
ANÁLISE E DESENVOLVIMENTO DE SISTEMAS 
WEBAULA 1 
Unidade 1 – Criando minha primeira classe 
 
Apresentação 
Caros alunos, 
Sou o professor Marcio Roberto Chiaveli. 
Estaremos trabalhando juntos na Disciplina de Desenvolvimento 
Orientado a Objetos I. Vamos aplicar, na prática, o que conhecemos 
na teoria desta disciplina, um conceito amplamente discutido e 
estudado no meio tecnológico de desenvolvimento de softwares. 
Afinal, um software bem projetado garante a integridade das 
informações, que são geradas na sua execução. 
Aqui na unidade I, vamos tratar dos procedimentos iniciais de como 
projetar e implementar uma classe em c#. Também vamos aprender 
como instanciar um objeto desta classe e consumi-lo. 
O estudo da programação orientada a objeto em C# passa 
obrigatoriamente pela criação de sua primeira classe. Nesta web aula, 
vamos fazer passo-a-passo como criar uma classe. 
Para desenvolvermos todos os nossos exercícios, vamos criar 
aplicativos do tipo CONSOLE APPLICATION. 
Vamos lá! 
Vamos abrir o C# e criarmos um novo projeto, selecionando, no menu 
do sistema, a opção File -> New Project... O C# mostrará a sua 
biblioteca de templates de projetos. Selecione a template Console 
Application, e, na parte inferior da tela de templates, digite um nome 
para o nosso projeto. Então, no campo Name, coloque o nome do 
projeto de Web Aula1. 
Se tudo deu certo, estará aparecendo na sua tela o seguinte trecho de 
código: 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
namespace ConsoleApplication1 
{ 
 class Program 
 { 
 static void Main(string[] args) 
 { 
 } 
 } 
} 
 
Muito bem, para testarmos se o nosso projeto foi criado corretamente, 
vamos fazer um teste: 
 
Escreva o seguinte código que está em negrito logo após a linha static 
void Main(string[] args). Ficando, então, da seguinte forma: 
static void Main(string[] args) 
{ 
 Console.WriteLine("Ola Mundo"); 
 Console.Write("Pressione uma tecla para continuar"); 
 Console.ReadKey(); 
} 
Agora, pressione a tecla F5 para executar a aplicação. Será mostrada 
a seguinte tela: 
 
Figura 1 
Ok!!! 
Bom, isso foi só para aquecer. Vamos agora criar a nossa classe. 
 
Conforme a figura abaixo, na janela Solution Explorer, clique com o 
botão direito sobre o nome do projeto que criamos, WebAula1, depois 
selecione Add Class... 
 
Figura 2 
Novamente, o C# mostrará a janela que disponibiliza as templates do 
projeto. Como você pode ver, a template Class já está selecionada. 
Então, vamos dar um nome para a nossa classe, substituindo o nome 
default (Class1.cs) que o C# sugere, digitando o nome Pessoa no 
campo Name na parte inferior da tela das templates, e clicando no 
botão Add. 
Temos agora em nosso projeto uma arquivo chamado Pessoa.cs, como 
está sendo mostrado na janela do Solution Explorer. 
A primeira coisa que vamos fazer é renomear a nossa classe 
como _Pessoa. Isso mesmo, coloque um tarcinho (underline) no 
começo do nome. Isso será um padrão que vamos assumir em todas a 
classes que criarmos. Vocês vão entender mais à frente a razão disto. 
Agora vamos criar os atributos private da nossa classe. Entre as 
chaves do corpo da nossa classe vamos começar a codificá-los. 
namespace WebAula1 
{ 
 class _Pessoa 
 { 
 private DateTime _DataCadastro; 
 private int _Codigo; 
 private string _Nome; 
 private string _Cpf; 
 private string _Endereco; 
 private string _Cidade; 
 private string _Uf; 
 private string _Cep; 
 } 
} 
 
Veja, criamos somente atributos private. Isso quer dizer que estes 
atributos não estarão disponíveis fora desta classe. Para que possamos 
usar esta classe e gravar valores nos atributos, precisamos publicá-los, 
ou seja, criarmos propriedades públicas que permitam o acesso a estes 
atributos. Vamos fazer isto agora. 
public DateTime DataCadastro 
 { 
 get { return _DataCadastro; } 
 set { _DataCadastro = value; } 
 } 
 public int Codigo 
 { 
 get { return _Codigo; } 
 set { _Codigo = value; } 
 } 
 public string Nome 
 { 
 get { return _Nome; } 
 set { _Nome = value; } 
 } 
 public string Cpf 
 { 
 get { return _Cpf; } 
 set { _Cpf = value; } 
 } 
 public string Endereco 
 { 
 get { return _Endereco; } 
 set { _Endereco = value; } 
 } 
 public string Cidade 
 {get { return _Cidade; } 
 set { _Cidade = value; } 
 } 
 public string Uf 
 { 
 get { return _Uf; } 
 set { _Uf = value; } 
 } 
 public string Cep 
 { 
 get { return _Cep; } 
 set { _Cep = value; } 
 } 
Com isto, já podemos ver como isso pode ser feito em classe: 
Selecione o arquivo Programa.cs, dando um duplo click no seu nome, no Solution 
Explorer, ou selecione na aba dos arquivos: 
 
Figura 3 
Apague as três linhas que fizemos no começo da aula e escreva o 
seguinte código para instanciar nossa classe: 
namespace WebAula1 
{ 
 class Program 
 { 
 static void Main(string[] args) 
 { 
 _Pessoa Pessoa = new _Pessoa(); 
 } 
 } 
} 
A linha em negrito está criando um objeto do tipo _Pessoa. Veja agora 
porque usamos um (_) underline no nome da classe: justamente para 
que, quando formos criar um a instância para um objeto, possamos 
usar o nome sem o (_) underline. Entenderam? 
Bom, vamos seguir com o nosso código. Depois de criar o objeto, 
vamos usá-lo. Para isso, vamos escrever um código que pergunte na 
tela os dados para preencher os campos da nossa classe. Veja como 
ficaria: 
namespace WebAula1 
{ 
 class Program 
 { 
 static void Main(string[] args) 
 { 
 _Pessoa Pessoa = new _Pessoa(); 
 Console.Write("Digite o código.....:"); 
 // Veja que nesta linha precisamos fazer a conversão 
 // do valor digtado pelo usuário pois toda entrada via console 
 // é do tipo texto e o nosso código e int, por isso devemos 
 // fazer a conversão utilizando o metodo ToInt32 da classe 
 // Convert. 
 Pessoa.Codigo = Convert.ToInt32(Console.ReadLine()); 
 Console.Write("Digite o nome.......:"); 
 Pessoa.Nome = Console.ReadLine(); 
 Console.Write("Digite o cpf........:"); 
 Pessoa.Cpf = Console.ReadLine(); 
 Console.Write("Digite o endereço...:"); 
 Pessoa.Endereco = Console.ReadLine(); 
 Console.Write("Digite a cidade.....:"); 
 Pessoa.Cidade = Console.ReadLine(); 
 Console.Write("Digite o estado.....:"); 
 Pessoa.Uf = Console.ReadLine(); 
 Console.Write("Digite o cep........:"); 
 Pessoa.Cep = Console.ReadLine(); 
 Console.WriteLine("=========================
================"); 
 Console.WriteLine(" Mostrando o conteúdo da classe 
Pessoa"); 
 Console.WriteLine("=========================
================"); 
 Console.WriteLine("Codigo.......: {0}", Pessoa.Codigo); 
 Console.WriteLine("Nome.........: {0}", Pessoa.Nome); 
 Console.WriteLine("Cpf..........: {0}", Pessoa.Cpf); 
 Console.WriteLine("Edereço......: {0}", Pessoa.Endereco); 
 Console.WriteLine("Cidade.......: {0}", Pessoa.Cidade); 
 Console.WriteLine("Estado.......: {0}", Pessoa.Uf); 
 Console.WriteLine("Cep..........: {0}", Pessoa.Cep); 
 Console.ReadKey(); 
 
 } 
 } 
} 
Por hoje é só! 
Clique aqui para baixar todo o projeto. 
WEBAULA 2 
Unidade 1 – Herança 
 
Bom, já estamos familiarizados com o C#, não é mesmo? 
Então, vamos direto ao assunto. 
Vamos abrir o C# e criarmos um novo projeto, selecionando no menu 
do sistema a opção File -> New Project... Selecione 
a template Console Application e, na parte inferior da tela 
de templates, digite o nome WebAula2 para nosso projeto. 
Conforme a figura abaixo, na janela Solution Explorer, clique com o 
botão direito sobre o nome do projeto que criamos, WebAula2. Depois, 
selecione Add Class... para adicionarmos um arquivo que conterá a 
classe pai. 
 
Figura 1 
Agora, dê o nome de Pessoa para o arquivo .cs. 
No arquivo Pessoa.cs, renomeie a classe Pessoa 
para _Pessoa (Lembrem do underline ( _ ) ). 
 
Agora, vamos criar os atributos private da classe, como segue: 
 private int _Codigo; 
 private string _Nome; 
 private string _Cpf; 
 private string _Fone; 
Na sequência, vamos publicar seus atributos: 
 public int Codigo 
 { 
 get { return _Codigo; } 
 set { _Codigo = value; } 
 } 
 public string Nome 
 { 
 get { return _Nome; } 
 set { _Nome = value; } 
 } 
 public string Cpf 
 { 
 get { return _Cpf; } 
 set { _Cpf = value; } 
 } 
 public string Fone 
 { 
 get { return _Fone; } 
 set { _Fone = value; } 
 } 
 
Agora, vamos criar alguns métodos para validar e formatar os valores 
dos atributos. 
Vamos criar um método para que, quando for solicitado o Cpf da 
pessoa, a classe devolva o valor formatado. 
O método é bem simples. Acompanhe: 
private string FormatarCpf() 
{ 
 return _Cpf.Substring(1, 3) + "." + 
 _Cpf.Substring(4, 3) + "." + 
 _Cpf.Substring(7, 3) + "-" + 
 _Cpf.Substring(10, 2); 
} 
O método SubString, da classe string, do qual o atributo _Cpf herda o 
tipo, extrai do atributo _Cpf. A partir de uma determinada posição, 
ele pega um valor n de caracteres estipulado. Desta forma, nós 
montamos o Cpf formatado com a máscara padrão. 
Em seguida, vamos atribuir o método FormatCpf à chamada do método 
get da propriedade Cpf. 
Obs: Quando eu falo de propriedade, estou falando daquela que nós 
publicamos com o comando Public (Ex: Cpf: sem o underline ), e 
quando falo de atributo, falo daqueles que definimos como Private (Ex 
_Cpf: com underline) 
Veja como ficaria: 
 public string Cpf 
 { 
 get { return FormatarCpf(); } 
 set { _Cpf = value; } 
 } 
 
Vamos fazer a mesma coisa para o atributo Fone, cujo método ficaria 
desta forma 
private string FormatarFone() 
{ 
return _Fone.Substring(1, 4) + "-" + 
 _Fone.Substring(5, 4); 
} 
Novamente, substitua a chamada do método: 
 public string Fone 
 { 
 get { return FormatarFone(); } 
 set { _Fone = value; } 
 } 
 
Agora, vamos fazer um programa para consumir esta classe. 
Selecione o arquivo Program.cs e vamos criar um método para 
executar a classe _Pessoa da seguinte forma: 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
namespace WebAula2 
{ 
 class Program 
 { 
 static void Main(string[] args) 
 { 
 ExecutarPessoa() 
 } 
 public static void ExecutarPessoa() 
 { 
 _Pessoa Pessoa = new _Pessoa(); 
 Console.Write("Informe o código.: "); 
 Pessoa.Codigo = Convert.ToInt32(Console.ReadLine()); 
 Console.Write("Informe o nome...: "); 
 Pessoa.Nome = Console.ReadLine(); 
 Console.Write("Informe o cpf....: "); 
 Pessoa.Cpf = Console.ReadLine(); 
 Console.Write("Informe o fone...: "); 
 Pessoa.Fone = Console.ReadLine(); 
 Console.WriteLine("=========================
==============="); 
 Console.WriteLine(" Mostrando os dados da classe 
Pessoa"); 
 Console.WriteLine("=========================
==============="); 
 Console.WriteLine("Código.....: {0}", Pessoa.Codigo); 
 Console.WriteLine("Nome.......: {0}", Pessoa.Nome); 
 Console.WriteLine("Cpf........: {0}", Pessoa.Cpf);Console.WriteLine("Telefone...: {0}", Pessoa.Fone); 
 Console.ReadKey(); 
 } 
 } 
} 
Execute o código e verá o efeito do método de formatação. 
Bom, por enquanto, nenhuma novidade, visto que isto já aprendemos 
na aula anterior. 
Agora, vamos fazer um programa para consumir esta classe. 
Selecione o arquivo Program.cs e vamos criar um método para 
executar a classe _Pessoa da seguinte forma: 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
namespace WebAula2 
{ 
 class Program 
 { 
 static void Main(string[] args) 
 { 
 ExecutarPessoa() 
 } 
 public static void ExecutarPessoa() 
 { 
 _Pessoa Pessoa = new _Pessoa(); 
 Console.Write("Informe o código.: "); 
 Pessoa.Codigo = Convert.ToInt32(Console.ReadLine()); 
 Console.Write("Informe o nome...: "); 
 Pessoa.Nome = Console.ReadLine(); 
 Console.Write("Informe o cpf....: "); 
 Pessoa.Cpf = Console.ReadLine(); 
 Console.Write("Informe o fone...: "); 
 Pessoa.Fone = Console.ReadLine(); 
 Console.WriteLine("=========================
==============="); 
 Console.WriteLine(" Mostrando os dados da classe 
Pessoa"); 
 Console.WriteLine("=========================
==============="); 
 Console.WriteLine("Código.....: {0}", Pessoa.Codigo); 
 Console.WriteLine("Nome.......: {0}", Pessoa.Nome); 
 Console.WriteLine("Cpf........: {0}", Pessoa.Cpf); 
 Console.WriteLine("Telefone...: {0}", Pessoa.Fone); 
 Console.ReadKey(); 
 } 
 } 
} 
Execute o código e verá o efeito do método de formatação. 
Bom, por enquanto, nenhuma novidade, visto que isto já aprendemos 
na aula anterior. 
 
Vamos codificar a classe, como segue abaixo: 
namespace WebAula2 
{ 
 class _Aluno: _Pessoa 
 { 
 public _Aluno(int pCodigo, string pNome, int pMatricula) 
 { 
 Codigo = pCodigo; 
 Nome = pNome; 
 Matricula = pMatricula; 
 } 
 public _Aluno(int pCodigo) 
 { 
 Codigo = pCodigo; 
 } 
 public _Aluno() 
 { 
 } 
 private int _Matricula; 
 private string _Curso; 
 private string _Turno; 
 private string _Turma; 
 public int Matricula 
 { 
 get { return _Matricula; } 
 set { _Matricula = value; } 
 } 
 public string Curso 
 { 
 get { return _Curso; } 
 set { _Curso = value; } 
 } 
 public string Turno 
 { 
 get { return _Turno; } 
 set { _Turno = value; } 
 } 
 public string Turma 
 { 
 get { return _Turma; } 
 set { _Turma = value; } 
 } 
 } 
} 
Ok. Agora vamos construir o programa para consumir a nossa classe 
_Alunos. 
Selecione o arquivo Program.cs e comente a linha que está chamando 
o método ExecutarPesso() e vamos criar um outro método para 
consumir a nossa classe _Alunos, da seguinte forma: 
No final do método ExecutarPessoa(), insira este código: 
 public static void ExecutarAluno() 
 { 
 _Aluno Aluno = new _Aluno(); 
 // Note que estes atributos não estão definidos na classe 
 // _Aluno no entanto estão disponiveis porque esta 
 // é uma característica da herança 
 Console.Write("Informe o código.: "); 
 Aluno.Codigo = Convert.ToInt32(Console.ReadLine()); 
 Console.Write("Informe o nome...: "); 
 Aluno.Nome = Console.ReadLine(); 
 Console.Write("Informe o cpf....: "); 
 Aluno.Cpf = Console.ReadLine(); 
 Console.Write("Informe o fone...: "); 
 Aluno.Fone = Console.ReadLine(); 
 // Ja daqui para baixo são os atribtos da classe _Alunos 
 Console.Write("Informe a matricula.: "); 
 Aluno.Matricula = Convert.ToInt32(Console.ReadLine()); 
 Console.Write("Informe o curso...: "); 
 Aluno.Curso = Console.ReadLine(); 
 Console.Write("Informe o turno....: "); 
 Aluno.Turno = Console.ReadLine(); 
 Console.Write("Informe a turma...: "); 
 Aluno.Turma = Console.ReadLine(); 
 Console.WriteLine("=========================
=============="); 
 Console.WriteLine(" Mostrando os dados da classe Aluno"); 
 Console.WriteLine("=========================
=============="); 
 Console.WriteLine("Código.....: {0}", Aluno.Codigo); 
 Console.WriteLine("Nome.......: {0}", Aluno.Nome); 
 Console.WriteLine("Cpf........: {0}", Aluno.Cpf); 
 Console.WriteLine("Telefone...: {0}", Aluno.Fone); 
 Console.WriteLine("Matrícula..: {0}", Aluno.Matricula); 
 Console.WriteLine("Curso......: {0}", Aluno.Curso); 
 Console.WriteLine("Turno......: {0}", Aluno.Turno); 
 Console.WriteLine("Turma......: {0}", Aluno.Turma); 
 
 Console.ReadKey(); 
 } 
Clique aqui para baixar o projeto inteiro. 
Resumo: Vimos como criar uma classe através da herança e como 
utilizá-la em programas. 
Até a próxima! 
 
Hoje, vamos desenvolver uma classe, usando os conceitos de herança 
e polimorfismo 
Vamos por a mão na massa! 
Vamos abrir o C# e criarmos um novo projeto, selecionando no menu 
do sistema a opção File -> New Project... Selecione 
a template Console Application e, na parte inferior da tela 
de templates, digite o nome WebAula1 para nome do nosso projeto. 
Salve o projeto, clicando no botão salvar 
 
Figura 1 
Conforme a figura abaixo, na janela Solution Explorer, clique com o 
botão direito sobre o nome do projeto que criamos, WebAula1, e 
depois selecione Add Class... para adicionarmos um arquivo que 
conterá a classe pai. 
 
Figura 2 
Agora, dê o nome de Funcionario para o arquivo .cs. 
No arquivo Funcionario.cs, renomeie a classe Funcionario 
para _Funcionario 
Agora, vamos codificar a nossa classe, conforme o código abaixo: 
 class _Funcionario 
 { 
 // Esta constante será usada para calcular o 
 // salario liquido do funcionário 
 // e corresponde a 8% 
 private const double INSS = 0.08; 
 private int _Codigo; 
 private string _Nome; 
 private string _Cpf; 
 private double _Salario; 
 public _Funcionario() 
 { 
 } 
 public int Codigo 
 { 
 get { return _Codigo; } 
 set { _Codigo = value; } 
 } 
 public string Nome 
 { 
 get { return _Nome; } 
 set { _Nome = value; } 
 } 
 public string Cpf 
 { 
 get { return _Cpf; } 
 set { _Cpf = value; } 
 } 
 public double Salario 
 { 
 get { return _Salario; } 
 set { _Salario = value; } 
 } 
 } 
 
Agora, vamos criar o método para calcular o salário do funcionário. 
O método é bem simples. Acompanhe: 
 public Double CalcularSalario() 
 { 
 return (_Salario - (_Salario * INSS)); 
 } 
O método está simplesmente subtraindo o valor de 8% (que é o valor 
da constante) do salário do funcionário e retornando o resultado. 
Vamos testar a classe. 
 
Selecione o arquivo Program.cs e vamos codificar o teste daseguinte 
forma: 
Crie um método chamado TelaFuncionario, logo abaixo do 
método Main, conforme o código abaixo: 
 class Program 
 { 
 static void Main(string[] args) 
 { 
 TelaFuncionario(); 
 } 
 private static void TelaFuncionario() 
 { 
 double Salario; 
 _Funcionario Funcionario = new _Funcionario(); 
 
 // Lembre que a console só le valores como textos 
 // por isso estamos usanto o convert para inteiro 
 Console.Write("Código.....:"); 
 Funcionario.Codigo = Convert.ToInt32(Console.ReadLine()); 
 Console.Write("Nome.......:"); 
 Funcionario.Nome = Console.ReadLine(); 
 Console.Write("Cpf........:"); 
 Funcionario.Cpf = Console.ReadLine(); 
 // E aqui estamos convertendo o valor lido 
 // pela console para Double 
 Console.Write("Salario....:"); 
 Funcionario.Salario = 
Convert.ToDouble(Console.ReadLine()); 
 Console.Write(""); 
 // Veja, aqui estamos invocando o método 
 // para calcular o salario do funcionario 
 Salario = Funcionario.CalculaSalario(); 
 // Escreva tudo na mesma linha 
 Console.Write("O salario liquido do funcionario {0} é de : 
 {1:c}",Funcionario.Nome,Salario); 
 Console.ReadKey(); 
 } 
 } 
Feito isso, pressione a tecla F5 para executar o projeto e ver o 
resultado. 
Muito bem. Agora, vamos criar um método para salvar o conteúdo da 
classe para um arquivo no sistema operacional. Para isso, vamos usar 
uma classe chamada StreamWriter. Veja a codificação a seguir: 
public void Salvar() 
 { 
 StreamWriter Funcionario = new 
StreamWriter(@"C:\Funcionario.Txt",true); 
 Funcionario.WriteLine("Código = " + _Codigo); 
 Funcionario.WriteLine("Nome = " + _Nome); 
 Funcionario.WriteLine("Cpf = " + _Cpf); 
 Funcionario.WriteLine("Salario = " + CalculaSalario()); 
 Funcionario.WriteLine("==========================
========="); 
 Funcionario.Flush(); 
 Funcionario.Close(); 
 } 
Veja que o construtor da classe StreamWriter recebe o nome do 
arquivo como parâmetro. O segundo parâmetro é booleano, e, se for 
(true), diz a classe que, se ao arquivo já existir, ele o abre para serem 
adicionados mais dados; e, se for (false), ele sempre criará um novo, 
sobrepondo o antigo. 
Método da classe StreamWriter 
 WriteLine => escreve no arquivo 
 Flush=> grava o arquivo 
 Close=> fecha o aquivo 
Agora vamos criar a classe vendedor herdando da classe funcionário. 
1. Adicione uma nova classe cujo nome do arquivo será Vendedor.cs. 
2. Renomeie a classe Vendedor para _Vendedor. 
3. Criar os seguintes Atributos privados: 
a. _Comissao (Double) 
b. _RegiaoAtuacao (string) 
c. _TipoInternoExterno (string) 
4. Publique estes atributos 
Na classe funcionário, temos dois métodos para tratamento de pessoa: 
um é o método Salvar, sendo que este método simplesmente grava 
num arquivo os dados da classe pessoa e o outro método calcula o 
salário da pessoa. Bom, só que agora nós estamos criando uma classe 
vendedor, fazendo herança da classe funcionário. Sendo assim, estes 
métodos são herdados também. Mas se nós invocarmos o método 
Salvar, por exemplo, ele gravará somente os dados de funcionário no 
arquivo Funcionário.Txt. Então, precisamos sobrescrever estes 
métodos, usando o conceito de Polimorfismo para que eles tratem 
dos dados de vendedor e não mais de funcionário. Vamos ver como 
fazer isso. 
Na nossa classe de vendedor, vamos criar o método para calcular o 
salário do vendedor. Veja: na classe funcionário eu já tenho este 
método, mas ele somente calcula o salário do funcionário. Agora, 
precisamos calcular o salário do vendedor. Usando o conceito de 
polimorfismo, vamos sobrepor o método de calcular salário da classe 
funcionário para mudarmos o cálculo, incluindo os cálculos que 
precisamos para obter o salário do vendedor. Vamos ver como fica o 
novo método. 
Para sobrepor um método, primeiro precisamos dizer na classe pai que 
o método em questão pode ser sobreposto usando a palavra 
chave virtual. Então, no método CalcularSalario da classe funcionário, 
vamos alterar o nosso método, incluindo a palavra-
chave virtual depois do public, na declaração do método: 
 
 public virtual Double CalcularSalario() 
 { 
 return _Salario - (_Salario * (INSS/100)); 
 } 
Isso faz com que o método CalcularSalario possa ser sobreposto nas 
classes filhas. 
 Muito bem, agora vamos sobrepor o método na nossa classe 
Vendedor, da seguinte forma: 
 public override double CalcularSalario() 
 { 
 double salario; 
 salario = base.CalcularSalario(); 
 salario = salario + (salario * (_Comissao / 100)); 
 return salario; 
 
 } 
Veja: na declaração do método, na classe filha, precisamos dizer que 
o método está sendo sobreposto, ou seja, é como se eu estivesse 
dizendo "Olha, o método CalcularSalario é assim agora" . Observe: 
dentro do novo método, eu chamei o método da classe pai usando a 
instrução base. Este comando diz que o CalcularSalario da classe pai 
é que deve ser executado. Com isso, ele executa o método da classe 
pai, fazendo os cálculos necessários, e armazena o valor na variável 
salário. Na sequência, eu insiro os cálculos necessários para se obter o 
salário do vendedor, retornando, assim, o salário mais a comissão. 
Vamos agora criar um método no arquivo Program.cs para testarmos 
a nossa classe vendedor. 
Crie o novo método com o nome TelaVendedor, da mesma forma 
como criamos o método TelaFuncionario, só que desta vez, usando a 
classe Vendedor conforme o código abaixo. 
 private static void TelaVendedor() 
 { 
 double Salario; 
 _Vendedor Vendedor = new _Vendedor(); 
 // Lembre que a console só le valores como textos 
 // por isso estamos usanto o convert para inteiro 
 Console.Write("Código.....:"); 
 Vendedor.Codigo = Convert.ToInt32(Console.ReadLine()); 
 Console.Write("Nome.......:"); 
 Vendedor.Nome = Console.ReadLine(); 
 Console.Write("Cpf........:"); 
 Vendedor.Cpf = Console.ReadLine(); 
 Console.Write("Região.....:"); 
 Vendedor.RegiaoAtuacao = Console.ReadLine(); 
 Console.Write("Tipo.......:"); 
 Vendedor.TipoInternoExterno = Console.ReadLine(); 
 Console.Write("Comissão...:"); 
 Vendedor.Comissao = 
Convert.ToDouble(Console.ReadLine()); 
 // E aqui estamos convertendo o valor lido 
 // pela console para Double 
 Console.Write("Salario....:"); 
 Vendedor.Salario = Convert.ToDouble(Console.ReadLine()); 
 Console.Write(""); 
 // Veja, aqui estamos invocando o método 
 // para calcular o salario do venddor 
 Salario = Vendedor.CalcularSalario(); 
 Console.Write("O salario liquido do vendedor {0} é de : 
{1:c}", Vendedor.Nome, Salario); 
 Console.ReadKey(); 
 } 
Bom, como exercício vou deixar vocês implementarem o 
método Salvar, usando o conceito de polimorfismo. 
Baixe o código completo aqui. 
 
WEBAULA 4 
Unidade 1 – Classes Abstratas, Interfaces e sealed 
 
Classe abstrata 
A classe abstrata é um tipo de classe que somente pode ser herdada e 
não instanciada. De certa forma, pode-se dizer que este tipo de classeé uma classe conceitual que pode definir funcionalidades para que as 
suas subclasses possam implementá-las. 
O conjunto de métodos na classe abstrata é obrigatoriedade, assim 
como a implementação nas suas subclasses. Em uma classe abstrata, 
os métodos declarados podem ser abstratos ou não, e suas 
implementações devem ser obrigatórias na subclasse. Quando criamos 
um método abstrato em uma classe abstrata, sua implementação é 
obrigatória. Caso você não implemente o mesmo, o compilador criará 
um erro em tempo de compilação. 
Exemplo de implementação retirado do books online em C#. 
abstract class formaClasse 
{ 
 abstract public int Area(); 
} 
class quadrado : formaClasse 
{ 
 int x, y; 
 // Se não for implementado o método Area() 
 // será gerado um compile-time error. 
 public override int Area() 
 { 
 return x * y; 
 } 
} 
 
 
Interface 
As interfaces são fundamentais em um sistema orientado a objetos. 
Quando dizemos que um objeto é a instância de uma classe, na 
verdade queremos dizer que este objeto implementa a interface 
definida pela classe, ou seja, uma interface define as operações que 
um objeto será obrigado a implementar. Para cada operação declarada 
por um objeto, deve ser especificado o nome da operação, os objetos 
que ela aceita como parâmetro e o tipo de valor retornado pela mesma; 
este conjunto de informações sobre uma determinada operação tem o 
nome de assinatura da operação, e a um conjunto de assinaturas de 
operações dá-se o nome de interface. 
É importante lembrar que uma interface nunca contém implementação, 
ou seja, numa interface não se pode definir campos, pois os mesmos 
são uma implementação de um atributo objeto. A interface também 
não permite construtores, pois num construtor temos as instruções 
usadas para inicializar campos. Para podermos usar uma interface, 
devemos criar uma classe ou estrutura e herdar da interface. Com isso, 
é obrigatório implementar todos os métodos da interface. 
Exemplo de implementação retirado do books online em C#. 
interface IExemploInterface 
{ 
 void ExemploMetodo(); 
} 
class Implementacaoclasse : IExemploInterface 
{ 
 // Implementação explicita da interface 
 void IExemploInterface.ExemploMetodo() 
 { 
 // Implementação do método 
 } 
 static void Main() 
 { 
 // Declarando uma instancia de uma interface 
 IExemploInterface obj = new Implementacaoclasse(); 
 // chame o método. 
 obj.SampleMethod(); 
 } 
} 
 
Classes Abstratas X Interfaces 
Uma classe abstrata pode conter métodos completos ou incompletos. 
Uma Interface pode conter apenas a assinatura de um método, mas 
nenhum corpo ou implementação. Portanto, em uma classe abstrata, 
pode-se implementar métodos, mas em uma Interface, não. Uma 
classe abstrata pode conter campos, construtores, ou destrutores e 
aplicar propriedades. Uma interface não pode conter campos, 
construtores, ou destrutores. Pode possuir apenas a propriedade da 
assinatura, mas não a implementação. Uma classe abstrata não 
suporta múltiplas heranças, mas uma interface pode suportá-las. 
Assim, uma classe pode herdar várias interfaces, mas apenas uma 
classe abstrata. Uma classe que implementa uma interface tem 
obrigatoriamente que implementar todos os métodos desta, mas o 
mesmo não é exigido no caso de uma classe abstrata. As classes 
abstratas são mais rápidas que as interfaces. 
 
Classe selada (Sealed Class) 
Uma classe selada é utilizada para restringir características da herança 
do objeto. Quando uma classe é definida como sealed, está classe não 
poderá ser herdada. Caso você tente, o compilador criará um erro em 
tempo de compilação. Após criar uma classe selada, quando você tenta 
criar uma herança para novas classes, pode-se observar que o 
intelisense não mostra o nome da classe definida como sealed. 
Exemplo de implementação retirado do books online em C#. 
sealed class ClasseSelada 
{ 
 public int x; 
 public int y; 
} 
class MainClass 
{ 
 static void Main() 
 { 
 ClasseSelada sc = new ClasseSelada(); 
 sc.x = 110; 
 sc.y = 150; 
 Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y); 
 } 
} 
 
Quando devo utilizar o que? 
Classes Abstratas podem adicionar mais funcionalidades, sem destruir 
as funcionalidades das classes filhos. Essas poderiam estar usando 
uma versão mais antiga. Classes abstratas fornecem uma maneira 
simples e fácil para "versionar" nossos componentes. Através da 
atualização da classe base, todas as classes que herdam são 
atualizadas automaticamente com a mudança. Em uma interface, a 
criação de funções adicionais terá um efeito sobre suas classes filhos 
devido à necessidade de implementação dos Métodos criados na 
interface. 
Classes abstratas deveriam ser usadas principalmente para objetos 
que estão estritamente relacionados, enquanto o uso de interfaces é 
mais adequado para fornecer funcionalidade comum a classes 
independentes. 
Digamos que existem duas classes, de pássaros e de aviões, e que nas 
duas existem os métodos chamados voar(). Seria estranho para uma 
classe aviões herdar, a partir de uma classe pássaros, apenas porque 
necessita do método voar(). Em vez disso, o método voar() deve ser 
definido em uma interface, e, em ambas as classes, pássaros e aviões 
devem implementar a interface. Se quisermos proporcionar uma 
funcionalidade em comum para os componentes, devemos utilizar uma 
classe abstrata. 
Classes abstratas nos permitem implementar parcialmente uma classe, 
enquanto a interface não contém a implementação de qualquer 
membro. Por isso, a seleção de interface ou classes abstratas depende 
das necessidades e design do nosso projeto. Podemos fazer uma classe 
abstrata, interface, ou até uma combinação de ambas, dependendo de 
nossas necessidades. Se desejarmos criar uma classe ou método 
interno para um componente ou library, o ideal é utilizar o tipo sealed 
porque qualquer tentativa de anular algumas das suas funcionalidades 
não será permitida. 
Nós podemos marcar uma classe ou método como selados por motivos 
comerciais, a fim de impedir um terceiro de modificar nossa classe. Por 
exemplo, no .NET, a string é uma classe selada. Não devemos usar a 
palavra-chave sealed com um método, a menos que o método seja 
uma mudança de outro método; ou, se estamos definindo um novo 
método e não queremos que ninguém mais o sobreponha, não 
devemos declará-lo como virtual em primeiro lugar. A palavra-chave 
selado fornece uma maneira de garantir que, ao sobrepor um método, 
seja fornecido um "final". Significa que ninguém mais poderá sobrepo-
lo novamente. 
Conclusão 
Devemos utilizar classes abstratas quando queremos compartilhar 
funcionalidades em comum entre classes, e utilizar interfaces quando 
desejamos que uma classe possua as mesmas assinaturas. Porém, a 
implementação de cada método não precisa ser a mesma. 
 
Unidade 2 – Conceitos de classes abstratas e 
interfaces 
 
O que é uma classe abstrata? (Abstract Class) 
A classe abstrata é um tipo de classe que somente pode ser herdada e 
não instanciada. De certa forma podemos dizer que este tipo de classe 
é conceitual, que pode definir funcionalidades para que as suas 
subclasses possam implementá-las de forma não obrigatória, ou seja 
ao se definir um conjunto de métodos na classe abstrata não é de total 
obrigatoriedade a implementação de todos os métodos em 
suas subclasses. 
Em uma classe abstrata os métodos declarados podem ser abstratos 
ou não e suas implementações devem ser obrigatórias na subclasse. 
Quando criamos um método em uma classe abstrata sua 
implementação é obrigatória pelas classes herdadas.Caso você não 
implemente o mesmo, o compilador criará um erro em tempo de 
compilação. 
 Exemplo de implementação retirado do books online 
em C#. 
 abstract class formaClasse 
{ 
 abstract public int Area(); 
} 
class quadrado : formaClasse 
{ 
 int x, y; 
 // Se não for implementado o método Area() 
 // será gerado um compile-time error. 
 public override int Area() 
 { 
 return x * y; 
 } 
} 
nterface 
As interfaces são fundamentais em um sistema orientado a objetos. 
Quando dizemos que um objeto é a instancia de uma classe, na 
verdade queremos dizer que este objeto implementa 
a interface definida pela classe, ou seja, uma interface define as 
operações que um objeto será obrigado a implementar. 
Para cada operação declarada por um objeto deve ser especificado o 
nome da operação, os objetos que esta operação aceita como 
parâmetro e o tipo de valor retornado pela operação. Este conjunto de 
informações sobre uma determinada operação tem o nome de 
assinatura da operação e a um conjunto de assinaturas de operações 
dá-se o nome de interface. 
É importante lembrar que uma interface nunca contém implementação, 
ou seja, numa interface não se pode definir campos, pois o mesmo é 
uma implementação de um atributo objeto. A interface também não 
permite construtores, pois num construtor temos as instruções usadas 
para inicializar campos. Para podermos usar uma interface devemos 
criar uma classe ou estrutura e herdar da interface, com isso é 
obrigatório implementar todos os métodos da interface. 
Exemplo de implementação. 
 interface IExemploInterface 
{ 
 void ExemploMetodo(); 
} 
class Implementacaoclasse : IExemploInterface 
{ 
 // Implementação explicita da interface 
 void IExemploInterface.ExemploMetodo() 
 { 
 // Implementação do método 
 } 
static void Main() 
 { 
 // Declarando uma instancia de uma interface 
 IExemploInterface obj = new Implementacaoclasse(); 
 // chame o método. 
 obj.SampleMethod(); 
 } 
} 
Classes Abstratas X Interfaces 
Uma classe abstrata pode conter métodos completos ou incompletos. 
Uma Interface pode conter apenas a assinatura de um método, mas 
nenhum corpo ou implementação. 
Portanto, em uma classe abstrata, pode-se implementar métodos, 
mas em uma Interface não. 
Uma classe abstrata pode conter campos, construtores, ou destrutores 
e aplicar propriedades. Uma interface não pode conter campos, 
construtores, ou destrutores; pode possuir apenas a propriedade da 
assinatura, mas não a implementação. 
Uma classe abstrata não suporta múltiplas heranças, mas 
uma interface pode suportar múltiplas heranças, assim uma classe 
pode herdar várias interfaces, mas apenas uma classe abstrata e uma 
classe que implementa uma interface tem de obrigatoriamente 
implementar todos os métodos da interface, mas o mesmo não é 
exigido no caso de uma classe abstrata, que são mais rápidas que 
as interfaces. 
Então, quando devo utilizar o quê? 
Classes Abstratas podem adicionar mais funcionalidades sem destruir 
as funcionalidades das classes filhos que poderiam estar usando uma 
versão mais antiga. Classes abstratas fornecem uma maneira simples 
e fácil para versionar nossos componentes e através da atualização da 
classe base, todas as classes que herdam são atualizadas 
automaticamente com a mudança. 
Em uma interface a criação de funções adicionais terá um efeito sobre 
suas classes filhos, devido à necessidade de implementação dos 
Métodos criados na interface. Então, classes abstratas deveriam ser 
usadas principalmente para objetos que estão estritamente 
relacionados, enquanto o uso de interfaces é mais adequado para 
fornecer funcionalidade comum a classes independentes. 
Digamos que existem duas classes, de pássaros e de aviões, e nas 
duas existam os métodos chamados voar(). Seria estranho para uma 
classe avião herdar a classe pássaro apenas porque necessita do 
método voar(). Em vez disso, o método voar() deve ser definido em 
uma interface e em ambas as classes pássaro e avião devem 
implementar a interface. Se quisermos proporcionar uma 
funcionalidade em comum para os componentes, devemos utilizar uma 
classe abstrata. 
Classes abstratas nos permitem implementar parcialmente uma classe, 
enquanto a interface não contem a implementação de qualquer 
membro, por isso a seleção de interface ou classes abstratas depende 
das necessidades e design do nosso projeto. 
Podemos fazer uma classe abstrata, interface, ou até uma combinação 
de ambas, dependendo de nossas necessidades. 
Conclusão 
Devemos utilizar classes abstratas quando queremos compartilhar 
funcionalidades em comum entre classes e utilizar interfaces quando 
desejamos que uma classe possua as mesmas assinaturas porém a 
implementação de cada método não precisa ser a mesma. 
Agora que já temos a interface e a classe que a implementa, para fazer 
uso da interface o que o cliente precisa fazer é instanciar um objeto 
que implemente essa interface e assinalar esse objeto á uma variável 
do tipo interface. Então vejamos uma construção de código 
usando interface: 
IminhaInterface obj:obj = new MinhaClasse():obj.Metodo2(): 
Apesar do uso de interface prover certa “indireção” relativa à classe 
que a implementa, o cliente ainda precisa instanciar a classe, como 
pode ser visto no exemplo anterior. Deste modo, não há uma completa 
separação entre a interface e a sua implementação. 
Como os métodos de MinhaClasse são públicos, pode-se também 
utilizar o seguinte código para acessar os métodos: 
MinhaClasse obj;obj = new MinhaClasse();obj.Metodo2(); 
Como essa construção é correta e, como já foi visto, mesmo quando 
fazemos uso de interface o cliente ainda precisa instanciar a classe que 
a implementa. Acredito que seja essa uma das razões pelas quais os 
desenvolvedores não dêem muita atenção ao uso de interfaces, 
principalmente aqueles que vêm do mundo não OOP e tem uma maior 
dificuldade em abstrair conceitos, ou seja, para que 
utilizar interfaces se podemos fazer acesso direto aos métodos 
utilizando apenas a classe? 
Bem, existe aí o principio das "boas práticas". Se você quiser levar a 
sério o conceito de projeto de software baseado em componentes, 
então há a necessidade de aderir a algumas regras práticas e uma 
delas é, sempre que possível, procurar separar a interface de sua 
implementação e, fazendo o uso de interfaces, prover um máximo de 
“desacoplamento” entre cliente e o provedor de serviços. 
Uma maneira de evitar o acesso direto aos método é a utilização da 
implementação explicita da interface no servidor, em que cada 
membro da interface é implementado utilizando o nome da interface. 
public class MinhaClasse() : IMinhaInterface{ void 
IminhaInterface.Metodo1(){....} void 
IminhaInterface.Medoto2(){....}} 
Note que nesse caso, as implementações dos métodos não mais 
utilizam a palavra public. 
Desse modo, o cliente só poderá fazer o acesso aos métodos, 
via interface: 
IminhaInterface obj;obj = new MinhaClasse();obj.Metodo2(); 
Se no cliente o desenvolvedor tentar instanciar a classe e assinalar o 
objeto â uma variável que não seja do tipo da interface, o compilador 
mostrará um erro, dizendo que a classe não contém o método em 
questão. 
 
WEBAULA 2 
Unidade 2 – Criando Classes - Interface 
 
 
O que é interface? 
Para quem não domina OOP, quando se fala em interface a primeira 
coisa que vem a mente é a interface com o usuário, ou seja, telas, 
botões, caixas de texto, etc. Bem, isso não deixa de ser 
uma interface mas, em OOP, o conceito de interface é bem diferente. 
No MSDN você vai verificar queinterfaces, da mesma maneira que 
classes, definem um conjunto de propriedades, métodos e eventos, 
porém, diferentemente das classes, interfaces não provêem 
implementações. Pode-se dizer que uma interface é semelhante a uma 
classe abstrata. 
Então, poderíamos ter: 
public interface IminhaInterface{ void Metodo1(); void Metodo2();} 
que seria semelhante a 
public abstract class MinhaInterface{ abstract public void 
Metodo1(); abstract public void Metodo2();} 
Note que tanto a interface como a classe abstrata não implementam 
os dois métodos. Surge então a pergunta: então qual a diferença? 
Podemos citar algumas pequenas diferenças: 
Classe abstrata 
- Pode ter ou não alguma implementação. Pode também ter variáveis 
membros, métodos não abstratos ou propriedades. 
- Pode derivar de apenas uma classe base, mesmo que essa classe 
base seja abstrata, mas pode derivar de quantas interfaces for 
necessário. 
- Pode ter métodos e propriedades não públicos, ou seja, private ou 
protected. 
- Pode ter métodos e membros estáticos (static) e definir constantes. 
Interface 
- Não tem implementações ou variáveis membros. 
- Só pode derivar de interfaces. 
- Todos os membros são públicos. 
- Não pode ter nenhum desses itens. 
 
 
Por que essas pequenas diferenças? 
Uma comparação bastante utilizada para a definição de interfaces é 
que elas atuam como um contrato entre o cliente e o provedor do 
serviço (a classe que implementa a interface) no qual o cliente está 
interessado. Num contrato, todas as regras têm que estar muito bem 
definidas, ou seja, tudo tem que ser mostrado publicamente e nada 
pode ser escondido. Imagine só um contrato em que 
algumas informações estivessem escondidas ou mesmo escritas com 
as famosas "letras miúdas". Desse modo, quando se fala em 
uma interface, ou contrato, o cliente pode seguramente se basear no 
que está escrito no contrato (interface) porque tudo o que está lá 
escrito será cumprido pelo provedor dos serviços. Pensando dessa 
maneira, agora fica claro porque todos os membros de 
uma interface são públicos e muito bem definidos e porque 
na interface não consta nenhum detalhe da implentação. Mesmo que 
haja alterações na implementação não afeta o cliente que se baseia 
numa interface que, por definição, é imutável. Isso também permite 
um alto grau de “desacoplamento” entre o cliente e o provedor, uma 
vez que a interface não tem nenhum conhecimento das 
implementações que ficam “encapsuladas” atrás da interface, ou seja, 
no provedor (classes). 
O provedor fica livre para levar a efeito as implementações, contanto 
que o conteúdo do contrato (interface) seja respeitado. Obviamente 
que o provedor pode fornecer muito mais do que consta no contrato, 
o que não faz diferença para o cliente, pois não afeta a interface, mas 
nunca menos para que não haja quebra de contrato. 
Surge então a pergunta: caso seja necessário, como estender as 
facilidades da interface? Uma vez que a interface pode estar sendo 
utilizada por outros clientes, a saída seria a utilização de 
outras interfaces ou, em outras palavras, o cliente fazer uso de 
múltiplos contratos. 
Implementando uma interface 
Para implementar uma interface, o que a classe tem que fazer é derivar 
da interface e implementar todos os métodos definidos na interface. 
Então teremos: 
public interface IMinhaInterface{ void Metodo1(); void Metodo2();} 
Note que o nome de interface deve iniciar com um I maiúsculo. 
Então, ao implementar a interface na classe, teremos: 
public class MinhaClasse : IMinhaInterface{ public void 
Metodo1(){......} public void Metodo2(){.....} // outras 
implementacoes int Medoto3(){.......}} 
Perceba que os métodos implementados na classe devem ser 
explicitamente declarados como públicos, uma vez que, por definição, 
todos os métodos da interface também o são. 
Agora que já temos a interface e a classe que a implementa, para fazer 
uso da interface o que o cliente precisa fazer é instanciar um objeto 
que implemente essa interface e assinalar esse objeto á uma variável 
do tipo interface. Então vejamos uma construção de código 
usando interface: 
IminhaInterface obj:obj = new MinhaClasse():obj.Metodo2(): 
Apesar do uso de interface prover certa “indireção” relativa à classe 
que a implementa, o cliente ainda precisa instanciar a classe, como 
pode ser visto no exemplo anterior. Deste modo, não há uma completa 
separação entre a interface e a sua implementação. 
Como os métodos de MinhaClasse são públicos, pode-se também 
utilizar o seguinte código para acessar os métodos: 
MinhaClasse obj;obj = new MinhaClasse();obj.Metodo2(); 
Como essa construção é correta e, como já foi visto, mesmo quando 
fazemos uso de interface o cliente ainda precisa instanciar a classe que 
a implementa. Acredito que seja essa uma das razões pelas quais os 
desenvolvedores não dêem muita atenção ao uso de interfaces, 
principalmente aqueles que vêm do mundo não OOP e tem uma maior 
dificuldade em abstrair conceitos, ou seja, para que 
utilizar interfaces se podemos fazer acesso direto aos métodos 
utilizando apenas a classe? 
Bem, existe aí o principio das "boas práticas". Se você quiser levar a 
sério o conceito de projeto de software baseado em componentes, 
então há a necessidade de aderir a algumas regras práticas e uma 
delas é, sempre que possível, procurar separar a interface de sua 
implementação e, fazendo o uso de interfaces, prover um máximo de 
“desacoplamento” entre cliente e o provedor de serviços. 
Uma maneira de evitar o acesso direto aos método é a utilização da 
implementação explicita da interface no servidor, em que cada 
membro da interface é implementado utilizando o nome da interface. 
public class MinhaClasse() : IMinhaInterface{ void 
IminhaInterface.Metodo1(){....} void 
IminhaInterface.Medoto2(){....}} 
Note que nesse caso, as implementações dos métodos não mais 
utilizam a palavra public. 
Desse modo, o cliente só poderá fazer o acesso aos métodos, 
via interface: 
IminhaInterface obj;obj = new MinhaClasse();obj.Metodo2(); 
Se no cliente o desenvolvedor tentar instanciar a classe e assinalar o 
objeto â uma variável que não seja do tipo da interface, o compilador 
mostrará um erro, dizendo que a classe não contém o método em 
questão. 
WEBAULA 3 
Unidade 2 – Implementação de classes abstratas e 
interfaces 
 
Classes Abstratas 
Existem ocasiões nas quais as classes seguem um padrão para que no 
futuro outras classes herdem desta classe base. Neste caso já se tem 
a herança em mente. Imagine que ao criar uma classe você perceba 
que, ao invés dela servir a um único propósito, possa ser generalizada 
e usada para outros objetivos. 
Imagine que você esta criando uma classe e que pretende usá-la para 
efetuar processos, por exemplo, cálculos para retângulos, quadrados, 
paralelogramos e triângulos. O primeiro pensamento que vem é que 
todos estes objetos têm algo em comum, portanto pode-se criar uma 
classe que atenda a todos, mesmo que os processos (no caso algum 
cálculo) sejam diferentes em cada um. 
Esta classe seria uma Classe Base para eles. Como são objetos 
geométricos e cada um tem uma forma diferente, pode-se criar uma 
classe que tenha atributos e métodos que sirvam para todos, porém 
podem existir métodos que sejam comuns a todos, mas que o trabalho 
realizado seja diferente para cada objeto. 
Para atender a este problema, existem as classes abstratas e métodos 
abstratos, além de propriedades, eventos e indexadores abstratos. A 
implementação deste tipo de classe é diferente das chamadas Classes 
Concretas. 
Se cada objeto geométrico é uma classe, pode-se criar uma que seja 
a classe base para elas, por exemplo, ClasseForma. Neste caso, não 
se faz necessária a implementação de métodos particulares, apenas 
especificações, permitindo que a criação de apenas o protótipo de 
métodos, isto é, métodos que não têm bloco de comando, somente seu 
escopo. Estes métodos recebem o nome de métodos abstratos. 
O código de cada um destes métodos é feito somente nas classes 
derivadas da classe abstrata. Entretanto, existem duas implicações: 
a) não é possível instanciar objetos da classe, uma vez que os métodos 
são incompletos; 
b) há a obrigatoriedade da implementação de todos os métodos 
abstratos para que se possa instanciar a classe derivada. Esta segunda 
exigência cria um tipo de contrato futuro, isto é, faz com que todas as 
classes que derivarem desta classe base implementem, 
obrigatoriamente, os métodos abstratos. 
A definição de uma classe abstrata e método abstrato ficam da 
seguinte forma: 
abstract class Forma{ abstract double area() 
} 
Qualquer classe derivada da classe forma, seja ela a classe círculo, 
retângulo, triângulo ou qualquer outra do gênero terá que implementar 
o método area( ), obviamente elas farão o seu próprio código de 
cálculo de uma área. 
Interfaces 
Interfaces são modelos para a construção de outras classes. 
Diferentemente das classes abstratas, as interfaces não carregam 
código algum dentro de sua estrutura, elas apenas definem métodos, 
propriedades e permitem a declaração de constantes. Implicitamente 
os métodos das interfaces têm seus acessos declarados como public e 
abstract. 
Então, como se pode ver, uma interface não tem aplicação sozinha. Ela 
contém apenas as definições de eventos, indexadores, métodos e/ou 
propriedades. A razão pela qual as interfaces fornecem apenas as 
definições é porque elas são implementadas por classes e estruturas, 
as quais devem proporcionar uma aplicação para cada membro 
definido dentro desta interface. 
Para exemplificar a construção de uma interface e classe derivada, 
utilizou-se a idéia de impressão e edição, isto é, serão construídas duas 
interfaces. Veja o exemplo a seguir: 
interface Interf1{ public void mostrar(); public void 
mostrarnoConsole(); 
} 
 
Veja que os métodos não têm codificação, apenas definições. Logo, 
qualquer classe que implementar a interface terá o compromisso de 
criar o corpo dos métodos definidos na interface. O escopo de uma 
classe que herda da interface Interf1 fica da seguinte forma: 
class Pessoa: Interf1 
 
Como já citado, em CSharp não existe herança múltipla, contudo é 
possível implementar as operações de múltiplas interfaces. Não é 
contraditório dizer que não existe herança múltipla, mas pode 
implementar múltiplas interfaces? 
Quando se diz que não há herança múltipla, é devido à impossibilidade 
de uma classe herdar características de duas ou mais classes ou classes 
abstratas. Todas as classes e classes abstratas contêm 
implementações, isto é, seus métodos são criados dentro da sua 
classe, com exceção, é claro, dos métodos abstratos em classes 
abstratas. 
Nas interfaces não existem corpos para os métodos, apenas seus 
escopos (assinaturas), e não existem atributos com valores variáveis, 
apenas as chamadas constantes, nas quais o valor nunca muda 
durante a execução do programa. 
Em resumo, quando uma classe herda outra, pode reaproveitar ou 
especificar comportamentos de objetos em uma hierarquia. Quando 
uma classe implementa uma interface, ela não reaproveita código, uma 
vez que não existem tais códigos, todavia ela se vê obrigada a seguir 
os comportamentos ditados pela interface. 
Veja como fica a declaração de uma classe que implementa duas 
interfaces: 
 interface Idemonstra 
 { 
 void Mostrar(); 
 } 
 interface Idemonstra1 
 { 
 void Mostrar(); 
 } 
class Implementa:Idemonstra,Idemonstra1 
{ 
 void Idemonstra.Mostrar() 
 { 
 Console.WriteLine("Show() method Implemented"); 
 } 
 void Idemonstra1.Mostrar() 
 { 
 Console.WriteLine("Display() method Implemented"); 
 } 
 public static void Main(string[] args) 
 { 
 Implementa InstClasse = new Implementa(); 
 IsntClasse.Idemonstra.Mostrar(); 
 IsntClasse.Idemonstra1.Mostrar(); 
 } 
} 
Conclusão 
Nesta unidade foi abordado o conceito de herança, classes abstrata e 
interfaces. Portanto, é importante que você compreenda bem e passe 
a utilizar tal conceito de forma coerente. 
 
Resumo 
Em algumas ocasiões as classes seguem um padrão para que no futuro 
outras classes herdem desta classe, que será chamada de Classe Base. 
Uma classe base pode ter mais de uma classe derivada, porém uma 
classe que derivará de uma base só poderá herdar dela, isto é, uma 
classe derivada tem apenas uma classe base. 
Nas classes chamadas abstratas existem métodos que não contêm 
corpo, são os chamados métodos abstratos. O código destes métodos 
abstratos é feito somente nas classes derivadas da classe abstrata. 
Foram apresentadas duas regras para estas classes abstratas: 
a) não é possível instanciar objetos da classe, uma vez que os métodos 
são incompletos; 
b) há a obrigatoriedade da implementação de todos os métodos 
abstratos para que se possa instanciar a classe derivada. 
Existem ainda as interfaces, que tem similaridades com o escopo de 
uma classe, porém não são classes. As interfaces são um tipo de 
modelo para a construção de outras classes e diferenciam-se das 
classes abstratas por não carregarem código algum dentro de sua 
estrutura. Apenas definem métodos, propriedades e permitem a 
declaração de constantes. Implicitamente os métodos 
das interfaces têm seus acessos declarados como public e abstract. 
 
Implementando com interfaces 
A sintaxe do uso de interfaces pode parecer muito estranha, à primeira 
vista. 
Vamos começar com um exercício para praticar a sintaxe: 
1. Crie um projeto novo no C# com o nome UsandoInterfaces 
2. Adicione uma classe ao seu projeto clicando com o botão direito 
sobre o nome do projeto (UsandoInterfaces) e de o nome de 
IFigurasGeometricas. 
3. No arquivo troque a palavra Class por interface 
Ficando então o nosso arquivo desta forma: 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
 
namespace UsandoInterfaces 
{ 
 interface IFormasGeometricas 
 { 
 double CalcularArea() 
 } 
} 
 
Agora vamos criar uma classe herdando da interface 
IFormasGeometricas 
Novamente clique com o botão direito no projeto e adicione mais uma 
classe e de o nome de FormasGeometricas. 
Agora vamos criar as classes que herdaram da interface 
IFormasGeometricas. 
Renomeie a classe FormasGeometricas para _Quadrado e faça a 
herança da interface da seguinte forma: 
 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
 
namespace UsandoInterfaces 
{ 
 class _Quadrado: IFormasGeometricas 
 { 
 public int Base { get; set; } 
 
 public double CalcularArea() 
 { 
 return Base * Base; 
 } 
 } 
} 
 
 
WEBAULA 4 
Unidade 2 – Classes Abstratas 
 
Vamos testar a nossa classe, monte o form da aplicação da seguinte 
forma: 
Agora crie um atributo no seu form deste maneira: 
 public partial class Form1 : Form 
 { 
 private _Quadrado Quadrado; 
 
Agora no form_Load (duplo clique no formulário) do seu formulário 
codifique da seguinte forma: 
 private void Form1_Load(object sender, EventArgs e) 
 { 
 Quadrado = new _Quadrado(); 
 } 
 
De um duplo clique no botão que você inseriu no form e codifique desta 
forma: 
 private void button1_Click(objectsender, EventArgs e) 
 { 
 Quadrado.Base = int.Parse(textBox1.Text); 
 textBox2.Text = Quadrado.CalcularArea().ToString(); 
 } 
Execute a aplicação e teste o cálculo, digitando o valor da base do 
quadrado a ser calculado. 
Vamos criar mais uma classe usando esta interface. Crie então a classe 
Circulo, veja a codificação abaixo: 
 class _Circulo : IFormasGeometricas 
 { 
 public double Diametro { get; set; } 
 
 public double CalcularArea() 
 { 
 // Formula da area de um circulo: 
 // pi * raio ao quadrado (O raio e a metade do diâmetro ou 
seja 
 // diâmetro dividido por 2) 
 // Math.Pow é o método que calcula potencia ex: 102 
 // em c# se escreve assim: Math.Pow(10,2) 
 
 double RaioAoQuadrado = Math.Pow(Diametro / 2, 2); 
 return (Math.PI * RaioAoQuadrado); 
 } 
 } 
 
 
Agora acrescente mais alguns componentes no seu form desta forma: 
No clique do botão Calcular Área do Circulo codifique desta forma: 
 { 
 Circulo.Diametro = double.Parse(textBox3.Text); 
 textBox4.Text = Circulo.CalcularArea().ToString(); 
 } 
 
Agora teste a classe circulo. 
Repare que se você tivesse usado herança, não ia ganhar muita coisa, 
já que cada implementação é totalmente diferente da outra: um 
Quadrado, um Retangulo e um Circulo têm atributos e métodos bem 
diferentes. Mas, mesmo que eles tivessem atributos em comum, 
utilizar interfaces é uma maneira muito mais elegante de modelar suas 
classes. Todas as classes que herdarem 
da Interface IFormasGeometricas possuirão o mesmo método 
chamado CalcularArea porém cada classes efetua uma calculo diferente 
acontecendo neste momento uma característica 
chamada polimorfismo. 
 
Como trabalhar com classes abstratas 
 Para criar uma classe abstrata precisamos usar a declaração 
abstract cuja sintaxe segue abaixo: 
 abstract class Util 
 { 
 
 } 
 Para entendermos as classes abstract, vamos criar os mesmos 
exercícios acima com classes abstratas. Vamos lá: 
 
1. Crie um projeto novo no C# com o 
nome UsandoClassesAbstratas 
2. Adicione uma classe ao seu projeto clicando com o botão direito 
sobre o nome do projeto (UsandoClassesAbstratas) e de o nome 
de AFigurasGeometricas. 
3. No arquivo adicione a clausula abstract antes da palavra Class 
 
Ficando então o nosso arquivo desta forma: 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
 
namespace UsandoClassesAbstrata 
{ 
 abstract class AFormasGeometricas 
 { 
 public abstract double CalcularArea(); 
 } 
} 
Agora vamos criar uma classe herdando das classes abstrata 
AFormasGeometricas. 
Novamente clique com o botão direito no projeto e adicione mais uma 
classe e de o nome de FormasGeometricas. 
Agora vamos criar as classes que herdaram da classe abstrata 
AFormasGeometricas. 
Renomeie a classe FormasGeometricas para _Quadrado e faça a 
herança da classes abstrata da seguinte forma: 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
 
namespace UsandoClassesAbstrata 
{ 
 class _Quadrado: AFormasGeometricas 
 { 
 public int Base { get; set; } 
 
 public override double CalcularArea() 
 { 
 return Base * Base; 
 } 
 } 
 
Veja que para implementar uma classe com classe abstrata, os 
métodos precisam ser definidos com a cláusula override. Essa foi a 
única diferença com relação a implementação com interfaces. 
 
Vamos testar a nossa classe, monte o form da aplicação da seguinte 
forma: 
 
Agora crie um atributo no seu form deste maneira: 
 public partial class Form1 : Form 
 { 
 private _Quadrado Quadrado; 
 
Agora no form_Load (duplo clique no formulario) do seu formulário 
codifique da seguinte forma: 
 private void Form1_Load(object sender, EventArgs e) 
 { 
 Quadrado = new _Quadrado(); 
 } 
De um duplo clique no botão que você inseriu no form e codifique desta 
forma: 
 private void button1_Click(object sender, EventArgs e) 
 { 
 Quadrado.Base = int.Parse(textBox1.Text); 
 textBox2.Text = Quadrado.CalcularArea().ToString(); 
 } 
Execute a aplicação e teste o cálculo, digitando o valor da base do 
quadrado a ser calculado. 
Vamos criar mais uma classe usando esta classes abstrata. Crie então 
a classe Círculo. Veja a codificação abaixo: 
 class _Circulo : AFormasGeometricas 
 { 
 public double Diametro { get; set; } 
 
 public override double CalcularArea() 
 { 
 // Formula da area de um circulo: 
 // pi * raio ao quadrado (O raio e a metade do diâmetro ou 
seja 
 // diâmetro dividido por 2) 
 // Math.Pow é o método que calcula potencia ex: 102 
 // em c# se escreve assim: Math.Pow(10,2) 
 
 double RaioAoQuadrado = Math.Pow(Diametro / 2, 2); 
 return (Math.PI * RaioAoQuadrado); 
 } 
 } 
Agora acrescente mais alguns componentes no seu form desta forma: 
 
No clique do botão Calcular Área do Circulo codifique desta forma: 
 { 
 _Circulo Circulo = new _Circulo(); 
 Circulo.Diametro = double.Parse(textBox3.Text); 
 textBox4.Text = Circulo.CalcularArea().ToString(); 
 } 
 
Agora teste a classe circulo.

Outros materiais