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 construir 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 onde os dados dos estudantes são devidamente protegidos, as notas são validadas e certas informações permanecem 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 é acessível publicamente, mas só pode ser definido durante a construção - Um campo
readonlyprivado para o ID do estudante (string) - este nunca deve ser acessível diretamente de fora - Uma lista privada para armazenar notas (inteiros)
- Uma propriedade pública somente leitura
Averageque calcula e retorna a média de todas as notas, ou0se não existirem notas - Um método público
AddGrade(int grade)que aceita apenas notas entre 0 e 100 (inclusive) - notas inválidas devem ser ignoradas silenciosamente - Um método público
GetGradeCount()que retorna quantas notas válidas foram registradas - Um método público
GetStudentInfo()que retorna 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 notas válidas são aceitas, 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 adicionar (inteiro)
- Segunda nota a adicionar (inteiro, pode ser inválida como -5 ou 150)
- Terceira nota a adicionar (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 deve ser:
Emma Wilson (ID: 2345)
Grades recorded: 2
Average: 87.5Observe como a nota inválida de 150 foi silenciosamente rejeitada, então apenas duas notas foram registradas. O ID do estudante está protegido - o código externo nunca pode ver o ID completo, apenas a versão mascarada através de GetStudentInfo(). O nome é legível, 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étodos