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:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.