Daniel: Boas-vindas a mais um curso na Alura sobre orientação a objetos com C#.
Eu sou Daniel Portugal, analista de sistemas e instrutor na Alura.
Daniel Portugal é um homem branco com cabelo e barba curtos e pretos. Tem olhos castanhos, usa óculos quadrados de armação preta e está de casaco preto.
Ao meu lado, o instrutor que vai nos ajudar nesse curso.
Guilherme: Olá, meu nome é Guilherme Lima. Também sou um dos instrutores desse treinamento.
Guilherme é um homem branco, de cabelo curto e barba castanhos, e olhos também castanhos. Usa óculos quadrados de armação preta e está com uma camisa cinza estampada.
Daniel: Aprendemos o básico de orientação a objetos no curso anterior da formação C#.
Agora, vamos preencher as lacunas, falando sobre herança, interface e polimorfismo. Vamos aplicar esses conceitos em um projeto bastante prático.
Guilherme: Além disso, vamos aplicar inteligência artificial em um projeto C#, seguindo boas práticas de programação e deixando nosso código próximo do que acontece nos projetos reais dessa linguagem.
Se você quer aprofundar ainda mais seus conhecimentos em orientação a objetos com C#, esse curso é para você!
Guilherme: Vamos iniciar nossos estudos? Para começar, vamos utilizar como base o projeto Screen Sound do primeiro curso onde criamos nossa primeira aplicação, aplicando conhecimentos do projeto do segundo curso onde aplicamos orientação a objetos.
Porém, teremos desafios, pois tivemos alguns incrementos no projeto.
Uma reflexão é que todo código que você criar na sua carreira como desenvolvedor(a) vai sofrer alteração, edição e manutenção. Alguns códigos criados por outras pessoas vão funcionar, outras vão causar erros. Isso é comum. Vamos perceber isso de forma prática.
Já fizemos download do projeto base que vamos usar durante o curso, disponibilizado na atividade "Preparando o ambiente".
Daniel: Após baixar e descompactar o arquivo, vamos à pasta raiz e abrimos o arquivo ScreenSound.sln
com duplo clique. Com isso, abre-se o Microsoft Visual Studio com o projeto aberto.
Vamos clicar na aba "Gerenciador de soluções" na lateral direita para visualizar os arquivos que compõem o projeto. Basicamente, temos uma mistura do primeiro e segundo curso.
No primeiro curso, temos a aplicação ScreenSound que fazia registro e avaliava bandas. No segundo curso, aplicamos orientação a objetos e temos algumas classes para representar o modelo de sistemas, como:
Guilherme: Primeiro, vamos conferir o Program.cs
que contém o programa inicial. Visualmente, parece muito com o código anterior. Mas, no método ExibirOpcoesDoMenu()
, temos uma opção a mais para exibir detalhes de uma banda.
Program.cs
:
// código omitido…
void ExibirOpcoesDoMenu()
{
ExibirLogo();
Console.WriteLine("\nDigite 1 para registrar uma banda");
Console.WriteLine("Digite 2 para registrar o álbum de uma banda");
Console.WriteLine("Digite 3 para mostrar todas as bandas");
Console.WriteLine("Digite 4 para avaliar uma banda");
Console.WriteLine("Digite 5 para exibir os detalhes de uma banda");
Console.WriteLine("Digite -1 para sair");
// código omitido…
}
Depois temos o switch(opcaoEscolhidaNumerica)
para cada uma das 5 opções. Em seguida, temos as funções principais de RegistrarBanda()
e MostrarBandasRegistradas()
.
Daniel: Nesse caso, temos duas mudanças no projeto inicial do curso.
Primeiro, ao invés de exibir só a média de uma banda, também exibimos os detalhes da banda. Segundo, também é novo o registro do álbum de uma banda. Assim, podemos registrar a banda e seus álbuns.
Guilherme: Interessante. Na segunda linha do código, estamos usando uma lista de banda registradas. É um dicionário que tem uma chave que é o nome da banda e a lista de inteiros que são as notas que aquela banda recebe.
Dictionary<string, List<int>> bandasRegistradas = new Dictionary<string, List<int>>();
bandasRegistradas.Add("Linkin Park", new List<int> { 10, 8, 6 });
bandasRegistradas.Add("The Beatles", new List<int>());
// código omitido…
Você mostrou na aba "Gerenciador de Soluções" que existem algumas classes, mas ainda não a estamos usando. Em suma, temos o código principal mais algumas classes para utilizar nesse projeto.
Daniel: Esse é o primeiro desafio: integrar as classes que trouxemos no Program.cs
.
Guilherme: Nessas classes, temos construtores, propriedades, alguns métodos e conseguimos entender o propósito de cada uma claramente. Afinal, nesse projeto educacional, temos apenas três classes e o programa principal para manipular, editar e atualizar.
Porém, em um projeto real podemos ter centenas de classes. Se o nosso projeto tivesse muitas classes para fazer integração, não conseguiríamos saber nem em qual classe mexer atualmente.
Daniel: Fica difícil de encontrar, principalmente porque estão todas na mesma pasta e no mesmo nível. Precisaríamos usar ferramentas da IDE para encontrar o arquivo.
Podemos facilitar essa busca ao trazer uma melhor organização de classes.
Guilherme: Nesse primeiro momento, não vamos aplicar as classes. Na verdade, vamos entender como organizar os arquivos, pensando em manutenção, suporte e facilidade de acesso.
Daniel: Sim, como fazemos manutenção na classe Banda.cs
, se não conseguimos encontrá-la dentre centenas de arquivos? Precisamos começar a separá-las em diretórios.
Para isso, no "Gerenciador de soluções" à direita, vamos clicar com o botão direito do mouse em cima do projeto ScreenSound
e escolher a opção "Adicionar > Nova Pasta".
Vamos dar um nome arbitrário comumente utilizado nos projetos no mercado de trabalho para separar classes que representam o modelo de negócio trabalhado. Vamos colocar "Modelos" no plural.
Essa pasta ainda está vazia. Agora, vamos mover os arquivos Album.cs
, Banda.cs
e Musica.cs
para dentro dessa nova pasta. Basta clicar no primeiro, apertar a tecla "Shift" e clicar no último para selecionar todos e arrastá-los para cima da pasta "Modelos".
Aparece um alerta para confirmar se queremos movê-los para um novo local. Vamos apertar "OK".
Em seguida, aparece outro alerta para ajustar namespaces para arquivos movidos. Queremos dar mais atenção a esse alerta e podemos fazê-lo no próximo vídeo.
Guilherme: Segura a ansiedade e não aperte nenhum botão. Vamos fazer essa correção logo após dar ênfase nessa palavra tão importante para o C#.
Daniel: Apareceu no Visual Studio um alerta com a seguinte pergunta:
Ajustar namespaces para arquivos movidos?
Esse termo namespaces é algo novo que deveríamos prestar atenção. Quando aparece um termo novo sobre o qual queremos conhecer, geralmente acessamos a documentação da linguagem ou da biblioteca.
Nesse caso, separamos um link da documentação do C# sobre namespaces, um fundamento da linguagem.
Basicamente, a documentação explica que o namespace é usado para organizar os tipos, sejam classes ou outros.
Nós começamos um processo de organização ao levar as classes para uma pasta. O Visual Studio tem uma extensão que vai tentar criar um namespace para refletir aquela pasta criada.
Guilherme: A documentação traz um exemplo interessante com o Console.WriteLine()
, que usamos bastante. Nesse caso, system
é o namespace e Console
é uma classe.
System.Console.WriteLine("Hello World!");
Podemos usar using
e o nome do namespace para não precisar referenciar sempre o caminho exato onde estão aqueles arquivos.
using System;
Console.WriteLine("Hello World!");
Daniel: É uma maneira de economizar digitação. Vamos aprender isso, na prática. Primeiro, vamos fazer o caminho longo e depois com o using
para perceber como fica mais fácil.
Nessa versão específica do Visual Studio que estamos rodando, essa ferramenta de ajustar namespaces não funcionou. Por isso, vamos apertar o "Não" e fazer esse ajuste manualmente para mostrar como deveria ficar no arquivo.
Primeiro, vamos abrir o arquivo Banda.cs
para começar pela hierarquia maior.
O que seria colocar o namespace no seu tipo? Na primeira linha, vamos apertar "Enter" para criar uma linha acima da declaração da classe Banda
. Nela, vamos escrever a palavra reserva namespace
e o próximo identificador será o nome do namespace.
Existem regras de nomenclaturas para o namespace. É comum colocar nome do projeto/empresa, em seguida o nome do módulo/pasta. A separação desses segmentos é o ponto.
Nesse caso, vamos escrever ScreenSound.Modelos
. Ao final, colocamos o ponto e vírgula.
Banda.cs
:
namespace ScreenSound.Modelos;
class Banda
{
// código omitido…
}
Se você pegar um código legado, isto é, que já existe de projetos anteriores, você pode encontrar uma declaração de namespace diferente.
Por exemplo, em vez de ponto e vírgula no final, tem abre e fecha chaves. Entre as chaves, ficaria a classe. Tem o mesmo significado.
Exemplo
namespace ScreenSound.Modelos
{
class Banda
{
// código omitido…
}
}
A diferença é que, quando usamos ponto e vírgula, temos um código mais elegante e enxuto, economizando indentação. Com isso, tudo que vier embaixo dessa declaração vai fazer parte desse namespace. Por isso, vamos usar essa recomendação do C# 10 a partir daqui.
Guilherme: Esse nome de namespace ScreenSound.Modelos
referente ao nome do projeto e da pasta vai ser o mesmo para as outras classes?
Daniel: Sim, basta copiar com "Ctrl + C" e colar com "Ctrl + V" na primeira linha dos arquivos Album.cs
e Musica.cs
. Salvamos os arquivos.
using
Guilherme: Agora que aplicamos os namespaces, o desafio é de fato começar a utilizar essas classes no nosso arquivo principal.
Daniel: Em Program.cs
, na três primeiras linhas, criamos um dicionário onde a chave é do tipo string com o nome da banda e o valor é uma lista de inteiros com as respectivas notas. Mas, o que queremos é um dicionário de bandas.
Para começar a entender como funcionaria, vamos criar as bandas Ira! e The Beatles como objetos da classe Banda
.
Primeiro, vamos fazer referência ao tipo Banda
. Repare que demos "Esc" para não autocompletar, porque queremos mostrar a questão do using
.
Em seguida, colocamos ira
como variável igual ao objeto new Banda()
através do construtor, onde passamos o nome da Banda Ira!
entre aspas duplas.
Program.cs
:
Banda ira = new Banda("Ira!");
Repare que o compilador coloca Banda
sublinhado de vermelho, indicando que não reconhece essa classe.
Guilherme: O Visual Studio não sabe o que é Banda
. Se passamos o mouse por cima do erro, o aviso é que o nome do tipo ou do namespace Banda
não pode ser encontrado.
Daniel: Inclusive, dá uma sugestão de usar uma diretiva using
ou uma referência de assembly. É isso o que vamos fazer, mas antes vamos mostrar na prática como poderíamos escrever diretamente para fazer o compilador reconhecer essa classe.
Antes de Banda
, poderíamos escrever ScreenSound.Modelos.
. Assim, ele já consegue reconhecer.
Exemplo
ScreenSound.Modelos.Banda ira = new ScreenSound.Modelos.Banda("Ira!");
Guilherme: Teria que escrever muito! Fora de cogitação.
Daniel: Sim, imagine ter que fazer o mesmo para a banda do The Beatles e outras bandas. Seria uma quantidade enorme de código repetido só para tentar achar a classe Banda
.
Por isso, a diretiva using
é tão importante. Se colocamos no topo do documento o using ScreenSound.Modelos
, não precisamos mais colocar a referência antes da Banda
. Por isso, esse trecho do código fica na cor cinza, pois não é mais necessário.
Inclusive, podemos economizar mais ao não colocar Banda
após new
. Afinal, já declaramos a variável do tipo Banda
, portanto, seu tipo está explícito.
using ScreenSound.Modelos;
Banda ira = new Banda("Ira!");
Banda beatles = new("The Beatles");
Se a variável é do tipo Banda
, então usar o mesmo tipo podemos no construtor.
O próximo passo é colocar os tipos na aplicação Program.cs
.
O curso C#: dominando Orientação a Objetos possui 130 minutos de vídeos, em um total de 49 atividades. Gostou? Conheça nossos outros cursos de .NET em Programação, ou leia nossos artigos de Programação.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
Mais de 1500 cursos completamente atualizados, com novos lançamentos todas as semanas, emProgramação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.
Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.
Emitimos certificados para atestar que você finalizou nossos cursos e formações.
Mais de 1500 cursos completamente atualizados, com novos lançamentos todas as semanas, emProgramação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.
Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.
Emitimos certificados para atestar que você finalizou nossos cursos e formações.
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com Luri até 100 mensagens por semana.
Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.
Acesso completo
durante 1 ano
Estude 24h/dia
onde e quando quiser
Novos cursos
todas as semanas