Recapitulação - Registros de Estudantes
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy. Lição 35 de 70.
Desafio
FácilVamos criar um sistema de registros de estudantes que reúna todas as técnicas de encapsulamento que você aprendeu neste capítulo. Você criará um sistema seguro no qual os dados dos estudantes sejam devidamente protegidos, as notas sejam validadas e determinadas informações permaneçam imutáveis após a criação.
Você organizará seu código em dois arquivos:
Student.cs: crie uma classeStudentno namespaceRecordsque demonstre o encapsulamento adequado. Seu estudante deve ter:- Um campo
readonlyName(string) que seja publicamente acessível, mas só possa ser definido durante a construção - Um campo privado
readonlypara o ID do estudante (string) — ele nunca deve ser diretamente acessível externamente - Uma lista privada para armazenar as notas (inteiros)
- Uma propriedade pública somente leitura
Averageque calcule e retorne a média de todas as notas, ou0se não houver notas - Um método público
AddGrade(int grade)que aceite apenas notas entre 0 e 100 (inclusive) — notas inválidas devem ser ignoradas silenciosamente - Um método público
GetGradeCount()que retorne quantas notas válidas foram registradas - Um método público
GetStudentInfo()que retorne uma string no formato"{Name} (ID: {last 4 characters of student ID})"— observe como você está expondo apenas uma versão mascarada do ID!
- Um campo
Program.cs: no seu arquivo principal, crie um estudante e adicione várias notas para demonstrar como o encapsulamento funciona. Você mostrará que as notas válidas são aceitas, as notas inválidas são rejeitadas e a média é calculada corretamente.
Você receberá cinco entradas:
- Nome do estudante
- ID do estudante (pelo menos 4 caracteres)
- Primeira nota a ser adicionada (inteiro)
- Segunda nota a ser adicionada (inteiro, pode ser inválida, como -5 ou 150)
- Terceira nota a ser adicionada (inteiro)
Imprima a saída neste formato:
{GetStudentInfo() result}
Grades recorded: {GetGradeCount()}
Average: {Average}Por exemplo, se as entradas forem Emma Wilson, STU12345, 85, 150 e 90, a saída deverá ser:
Emma Wilson (ID: 2345)
Grades recorded: 2
Average: 87.5Observe como a nota inválida 150 foi silenciosamente rejeitada, portanto apenas duas notas foram registradas. O ID do estudante é protegido — o código externo nunca pode ver o ID completo, apenas a versão mascarada por meio de GetStudentInfo(). O nome pode ser lido, mas é imutável. Isso é o encapsulamento trabalhando em conjunto para criar uma classe robusta e bem protegida!
Experimente você mesmo
using System;
using Records;
class Program
{
public static void Main(string[] args)
{
// Ler as entradas
string name = Console.ReadLine();
string studentId = Console.ReadLine();
int grade1 = Convert.ToInt32(Console.ReadLine());
int grade2 = Convert.ToInt32(Console.ReadLine());
int grade3 = Convert.ToInt32(Console.ReadLine());
// TODO: Criar um objeto Student com o name e studentId
// TODO: Adicionar todas as três notas usando o método AddGrade
// TODO: Imprimir a saída no formato exigido:
// {resultado de GetStudentInfo()}
// Grades recorded: {GetGradeCount()}
// Average: {Average}
}
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosNamespaces e DiretivasIntrodução a Classes e ObjetosA Palavra-chave 'this'Métodos e ParâmetrosCampos vs PropriedadesConstrutoresInicializadores de ObjetosRecapitulação - Calculadora Simples4Herança
Sintaxe Básica de Herança (:)A Palavra-chave 'base'Palavras-chave Virtual e OverrideClasses SeladasA Classe Base 'object'Recapitulação - Hierarquia de Funcionários7Recursos Avançados
Sobrecarga de OperadoresIndexadores (this[])Sobrescrita de ToString()Métodos de ExtensãoRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoSingleton Thread-SafePadrão FactoryPadrão Observer (Eventos)Padrão Strategy2Propriedades e Membros Estáticos
Propriedades AutoimplementadasPropriedades de Apenas Leitura/EscritaCampos e Métodos EstáticosClasses EstáticasMembros com Corpo de Expressão5Polimorfismo e Interfaces
Polimorfismo: Compilação vs ExecuçãoInterface vs Classe AbstrataMúltiplas InterfacesInterfaces ExplícitasUpcasting e DowncastingRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição sobre HerançaGenerics (Classes e Métodos)Delegates e EventosAtributos e ReflectionIDisposable e a Instrução usingFundamentos de Injeção de Dependência11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Arquitetura de Classes
Dados de Instância vs EstáticosPalavras-chave 'readonly' e 'const'Campos de SuporteRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Modificadores de AcessoPropriedades para EncapsulamentoImplementação de Ocultação de DadosPadrões de ImutabilidadeRecapitulação - Registros de Estudantes9Argumentos Variáveis
A Palavra-chave 'params'Parâmetros OpcionaisArgumentos NomeadosSobrecarga de MétodosPratique por conta própria: Compilador de C# online