Olá! Meu nome é Yasmin Araújo, sou instrutora na Escola de Programação, e irei me autodescrever para fins de acessibilidade.
Audiodescrição: Yasmin é uma mulher branca com cabelo castanho escuro médio, aproximadamente na altura dos ombros. Seu cabelo está repartido ao meio e ela está usando uma camiseta rosa choque. Ao fundo, há uma parede iluminada com luz azul.
Neste curso, vamos praticar a habilidade de trabalhar com classes, objetos e abstração. Mais especificamente, abordaremos os seguintes tópicos: o uso de classes, entendendo em que contexto é interessante utilizá-las, e aprenderemos a diferenciar classes de objetos.
Vamos aprender a usar a palavra-chave nil
para criar nossos objetos. Veremos também quais são os pilares da Programação Orientada a Objetos (P.O.O.). Por fim, vamos diferenciar o que são atributos e métodos.
Dentre os pilares da P.O.O., temos a abstração. A abstração nos ajudará a criar os melhores atributos e métodos possíveis para nossas classes. Todos esses tópicos relacionados a classes, objetos e abstração precisam ser muito praticados para que possamos internalizar nosso conhecimento.
É interessante assistir a todos os vídeos de revisão e, em seguida, focar bastante na prática para realmente aprender todos esses tópicos.
Vamos começar?
Para começarmos, vamos analisar os dados apresentados no slide. Temos dados de produtos diferentes e a ideia é construir um sistema de e-commerce para vender todos esses produtos. Para cada produto na tabela, temos um nome, uma descrição, um preço e um estoque. Os produtos incluem teclado, cadeira gamer, notebook, outro teclado e um mouse. Este é o exemplo da tabela.
Se quisermos representar esses dados via código, com o conhecimento que temos até agora, como isso ficaria? No Visual Studio, temos alguns exemplos. Criamos várias variáveis diferentes: nome1
, descrição1
, preço1
, estoque1
para representar o primeiro produto, e nome2
, descrição2
e assim por diante, para o segundo produto. Neste caso, escolhemos representar apenas dois produtos. Note que, para representar duas coisas diferentes, já precisamos criar muitas variáveis distintas. Imagine se tivéssemos 10, 15 ou 100 produtos. Criar quatro variáveis distintas para cada um deles seria cansativo e difícil de gerenciar.
Aqui está um exemplo de como isso seria feito com variáveis separadas:
string nome1 = "Teclado";
string descricao1 = "Modelo compacto e silencioso, " +
"perfeito para produtividade diária.";
decimal preco1 = 80.00m;
int estoque1 = 15;
Console.WriteLine($@"Dados do item 1:
Nome: {nome1},
Descrição: {descricao1}
Preço: {preco1},
Estoque: {estoque1}
");
string nome2 = "Cadeira gamer";
string descricao2 = "Conforto ergonômico com design" +
" moderno para longas sessões de jogo.";
decimal preco2 = 600.00m;
int estoque2 = 5;
Console.WriteLine($@"Dados do item 2:
Nome: {nome2},
Descrição: {descricao2}
Preço: {preco2},
Estoque: {estoque2}
");
Além disso, há outro ponto a considerar. Temos a variável estoque1
. Olhando para o exemplo, sabemos que estoque1
está relacionado a nome1
, mas poderia não estar. Não há garantia, pois as variáveis estão isoladas no código. O ideal seria que essas informações estivessem concentradas para que pudéssemos associá-las de alguma forma.
Para isso, podemos criar um tipo que agrupe todas essas características em comum. Como criamos um tipo em C#? Utilizando classes. Para criar uma classe que represente um produto com todas essas características em comum, dentro da solução "praticando C-sharp", no menu lateral direito, clicamos com o botão direito e selecionamos "adicionar novo item". Selecionamos "arquivo de código" e nomeamos como produto.cs
. Adicionamos ao código.
Feito isso, criamos um arquivo de código. Agora, precisamos criar o tipo produto
, que será uma classe. Usamos a palavra-chave class
e colocamos o nome da classe, que é produto
. Abrimos e fechamos chaves e, dentro delas, colocamos todas as características em comum de um produto: uma string
para o nome, uma string
para a descrição, um decimal
para o preço e, por fim, um int
para o estoque. Assim, criamos uma classe e a salvamos.
class Produto
{
string nome;
string descricao;
decimal preco;
int estoque;
}
Ao criar esse tipo, que é uma classe, estamos criando um tipo referenciado. Lembrando do nosso primeiro curso sobre variáveis e tipos, vimos os tipos primitivos e os tipos referenciados. Como trabalhamos com esses tipos referenciados? Como criamos uma variável com esse tipo? Começamos a criação como fizemos antes. Temos, por exemplo, o nome do nosso tipo, que será produto
. Em seguida, passamos o nome da variável, que chamaremos de item1
.
Agora, vem a diferença entre tipos primitivos e tipos referenciados. No tipo primitivo, conseguimos passar um valor diretamente, mas o tipo referenciado contém várias informações. Não conseguimos passar esse valor de uma vez. Precisamos pedir à memória que reserve um espaço para guardar essas informações.
Para realizar essa tarefa, utilizaremos o new
, Produto
, abrindo e fechando parênteses. Com isso, já reservamos espaço na memória.
Produto item1 = new Produto();
Agora, podemos preencher esse espaço, atribuindo valores a cada uma das características definidas na classe. Por exemplo, utilizaremos item1.nome
. Ao usar o ponto, acessamos a característica específica da classe. Assim, faremos item1.nome
e atribuiremos "teclado". Para as demais características, seguiremos o mesmo procedimento.
item1.nome = "Teclado";
item1.descricao = "Modelo compacto e silencioso, " +
"perfeito para produtividade diária.";
item1.preco = 80.00m;
item1.estoque = 15;
Identificamos um problema: o nome não está visível. Para corrigir isso, utilizaremos na classe produto
a palavra-chave public
. Vamos compreender melhor esse conceito no curso de encapsulamento. Por ora, aplicamos essa palavra-chave e posteriormente entenderemos seu significado. Usamos public
antes de cada característica da classe.
public string nome;
public string descricao;
public decimal preco;
public int estoque;
Agora, recompilamos o código e ele voltou a funcionar normalmente.
Prosseguindo, vamos definir item1.descrição
e atribuir a descrição do produto ao nosso item. Em seguida, item1.preço
será 80.00m e, por fim, item1.estoque
terá o valor 15.
Nosso objetivo é manter o comportamento anterior, que consiste em imprimir os dados de item1
. Para isso, copiaremos o console.writeLine
que está acima. Queremos que os dados sejam impressos, e para isso, utilizaremos o ponto novamente. Assim, usaremos item1.nome
, item1.descrição
, item1.preço
e item1.estoque
.
Console.WriteLine($@"Dados do item 1:
Nome: {item1.nome},
Descrição: {item1.descricao}
Preço: {item1.preco},
Estoque: {item1.estoque}
");
Após isso, podemos executar o código para verificar o resultado. Comentaremos o que está acima para não perdermos os dados. Executamos a aplicação e visualizamos os dados de item1
com todas as informações.
Verificamos que a criação da classe foi bem-sucedida. Observamos que cada informação está associada corretamente. O estoque 15 está associado ao nome "teclado", que também está associado ao preço e à descrição. Ao criar tipos, conseguimos agrupar todas essas informações.
Falando sobre a diferença entre classes e objetos, temos que uma classe é o modelo do tipo, descrevendo tudo que ele contém. Por exemplo, no caso de produto
, dizemos que todo produto tem um nome, descrição, preço e estoque. Contudo, não há valores associados a esses dados. Para associar valores e criar diferentes produtos, criamos objetos. A partir do modelo, podemos criar vários itens com valores distintos. Um sinônimo para objetos é instância, ou seja, temos várias instâncias de um mesmo produto.
Diferenciando classes de objetos, podemos afirmar que, ao utilizá-los, trabalhamos com o paradigma de Programação Orientada a Objetos (POO). Nesse paradigma, focamos em criar classes para descrever diferentes tipos. A POO possui vários pilares: abstração, encapsulamento, herança e polimorfismo. Neste curso, abordaremos a abstração, que se concentra em representar informações do mundo real através da programação orientada a objetos. Na sequência, aprofundaremos esse tema e aprenderemos a estruturar nossas classes de forma mais eficiente. Nos vemos na próxima aula!
Nós vimos que existem várias características em comum que podem ser agrupadas. Uma vez que agrupamos essas características, temos um tipo referenciado. Em C#, representamos esses tipos referenciados utilizando classes. Criamos uma classe para representar nosso produto e, dentro dessa classe, incluímos um nome, uma descrição, um preço e um estoque.
Produto
Para começar, vamos definir a estrutura básica da nossa classe Produto
com seus atributos:
class Produto
{
public string nome;
public string descricao;
public decimal preco;
public int estoque;
}
Além dessas características em comum, também temos comportamentos em comum. Por exemplo, para todo produto, podemos querer saber se ele está disponível ou não. Para determinar isso, precisamos verificar a característica estoque, observando se o estoque é maior do que zero. Podemos também trabalhar com o preço, aplicando um desconto que atualiza o valor. São várias operações em comum que ocorrem para todos os produtos, e conseguimos representar essas operações.
Produto
As características do nosso produto se assemelham a variáveis, enquanto os comportamentos de um produto, representados dentro das classes, se assemelham a funções. Dentro da classe Produto
, criaremos essas funções que serão comportamentos em comum. Para isso, declaramos um public
, que será ignorado por enquanto, e o retorno da função, que será um bool
. Criamos uma função para verificar se o estoque está disponível. Usamos o nome EstáDisponível
e abrimos e fechamos parênteses. O nome da função na classe utiliza o método Pascal Casing, no qual a primeira letra e as letras de todas as outras palavras são maiúsculas. Dentro dos parênteses, poderíamos colocar parâmetros, mas não será o caso nesta primeira função. Dentro das chaves, passamos o corpo da função, que retornará se o estoque é maior do que zero. Assim, sabemos se o produto está disponível ou não.
EstaDisponivel
Vamos construir essa função passo a passo:
Primeiro, declaramos a função EstaDisponivel
:
public bool EstaDisponivel()
{
}
Em seguida, implementamos a lógica para verificar se o estoque é maior que zero:
public bool EstaDisponivel()
{
return estoque > 0;
}
Agora, vamos criar uma nova função que representará a aplicação de um desconto no preço. Para isso, não teremos nenhum retorno, então usamos a palavra-chave void
, que indica que o retorno é vazio. Criamos o método AlterarPrecoComDesconto
. Abrimos os parênteses e, dentro deles, passamos um parâmetro que será um decimal desconto
. Agora, podemos pensar no corpo da função novamente.
Para conseguirmos alterar o preço aplicando um desconto, precisamos utilizar uma variável da classe. Vamos definir que o preço será igual ao preço antigo multiplicado pelo valor com desconto. O valor com desconto será 1 menos o desconto. Dessa forma, temos dois comportamentos, ou seja, duas funções diferentes para a mesma classe.
AlterarPrecoComDesconto
Vamos construir o método AlterarPrecoComDesconto
:
Primeiro, declaramos o método com o parâmetro desconto
:
public void AlterarPrecoComDesconto(decimal desconto)
{
}
Em seguida, implementamos a lógica para aplicar o desconto ao preço:
public void AlterarPrecoComDesconto(decimal desconto)
{
preco = preco * (1 - desconto);
}
program.cs
Como utilizamos essas funções no program.cs
? Utilizamos pontos, assim como fazemos com os atributos. Podemos, por exemplo, verificar se o item 1 está disponível ou não. Para isso, utilizamos item1.EstáDisponível
. Aqui, estamos realizando uma verificação para obter um valor booleano. Se o item estiver disponível, exibiremos uma mensagem no console com Console.WriteLine
informando que o produto está disponível. Corrigindo, a mensagem correta é "Produto está disponível".
Vamos ver como isso é feito no código:
if(item1.EstaDisponivel())
{
Console.WriteLine("Produto está disponível!");
}
Além disso, podemos também alterar o preço do produto. Para isso, utilizamos item1.AlterarPrecoComDesconto
, passando o valor do desconto. Suponhamos que utilizemos um desconto de 20%, então passamos 0.2m
. Após isso, podemos imprimir novamente os dados do item. Utilizamos Ctrl+C
e Ctrl+V
para copiar e colar o código logo abaixo. Em seguida, executamos a aplicação.
item1.AlterarPrecoComDesconto(0.2m);
Console.WriteLine(@$"Dados do item 1:
Nome: {item1.nome};
Descrição: {item1.descricao};
Preço: {item1.preco};
Estoque: {item1.estoque};
");
Ao executar, visualizamos os dados do item 1 anteriormente, com preço de R$ 80 e estoque de 15 unidades. Depois, imprimimos que o produto está disponível. Alteramos o código e, após aplicar o desconto, o preço passou a ser R$ 64. Dessa forma, verificamos que as funções da classe estão funcionando corretamente. Corrigimos o "S" em "disponível".
Assim, as funções e as variáveis ou características da classe estão funcionando corretamente. Utilizamos os termos variáveis ou características em comum, assim como funções ou comportamentos em comum. No entanto, a Programação Orientada a Objetos (P.O.) define termos específicos para isso. As características de uma classe são chamadas de atributos, e as funções de uma classe são chamadas de métodos.
O grande desafio é escolher os melhores atributos e métodos para representar nossas classes. Esse desafio é a abstração, que consiste em pegar o que está no mundo real e transformar em código, escolhendo os melhores atributos, métodos e classes específicas que queremos modelar. Na sequência, teremos uma série de exercícios para praticar essa habilidade de representar elementos do mundo real na programação, utilizando a abstração.
O curso Praticando C#: orientação a objetos com classes possui 20 minutos de vídeos, em um total de 17 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.