Recapitulação - Lista Personalizada
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 40 de 70.
Desafio
FácilVamos construir uma classe CustomList que reúne todos os recursos avançados deste capítulo - sobrecarga de operadores, indexadores, substituição de ToString() e métodos de extensão - para criar uma coleção que pareça natural e intuitiva de usar.
Você organizará seu código em três arquivos:
CustomList.cs: Crie uma classeCustomListno namespaceCollectionsque envolve um array de inteiros interno e fornece padrões de acesso intuitivos. Sua lista deve ter:- Um array de inteiros privado para armazenar itens e uma propriedade
Count(com um setter privado) rastreando quantos itens estão armazenados - Um construtor que aceita uma capacidade (inteiro) e inicializa o array interno com esse tamanho
- Um método
Add(int item)que adiciona um item à próxima posição disponível (se houver espaço) - Um indexador
this[int index]que permite obter e definir itens por posição - Um operador
+sobrecarregado que combina duas CustomLists em uma nova contendo todos os itens de ambas (a capacidade da nova lista deve ser a soma de ambos os counts) - Um método
ToString()sobrescrito que retorna os itens no formato[item1, item2, item3]- inclua apenas itens até oCount, não espaços vazios
- Um array de inteiros privado para armazenar itens e uma propriedade
ListExtensions.cs: Crie uma classe estáticaListExtensionsno namespaceCollectionscom um método de extensão para sua CustomList:Sum()- retorna a soma de todos os itens na lista (até oCount)
Program.cs: No seu arquivo principal, crie duas CustomLists, adicione itens a cada uma e, em seguida, demonstre todos os recursos funcionando juntos - use o indexador para acessar itens, combine listas com o operador+, imprima usandoToString()e calcule a soma usando seu método de extensão.
Você receberá seis entradas:
- Três inteiros para adicionar à primeira lista
- Três inteiros para adicionar à segunda lista
Crie a primeira lista com capacidade 5 e a segunda com capacidade 3. Adicione os três valores de entrada a cada respectiva lista.
Imprima a saída neste formato:
List 1: {ToString()}
List 2: {ToString()}
List 1[0]: {first item}
Combined: {ToString() of combined list}
Combined sum: {Sum()}Por exemplo, se as entradas forem 10, 20, 30, 5, 15 e 25, a saída deve ser:
List 1: [10, 20, 30]
List 2: [5, 15, 25]
List 1[0]: 10
Combined: [10, 20, 30, 5, 15, 25]
Combined sum: 105Observe como todas as peças funcionam juntas - o indexador oferece acesso semelhante a um array, o operador + permite combinar listas naturalmente, o ToString() fornece uma saída legível e o método de extensão adiciona funcionalidade utilitária. É assim que classes bem projetadas se parecem!
Experimente você mesmo
using System;
using Collections;
class Program
{
public static void Main(string[] args)
{
// Lê seis números inteiros
int a1 = Convert.ToInt32(Console.ReadLine());
int a2 = Convert.ToInt32(Console.ReadLine());
int a3 = Convert.ToInt32(Console.ReadLine());
int b1 = Convert.ToInt32(Console.ReadLine());
int b2 = Convert.ToInt32(Console.ReadLine());
int b3 = Convert.ToInt32(Console.ReadLine());
// TODO: Criar a primeira CustomList com capacidade 5
// TODO: Adicionar a1, a2, a3 à primeira lista
// TODO: Criar a segunda CustomList com capacidade 3
// TODO: Adicionar b1, b2, b3 à segunda lista
// TODO: Imprimir a Lista 1 usando ToString()
// TODO: Imprimir a Lista 2 usando ToString()
// TODO: Imprimir a Lista 1[0] usando o indexador
// TODO: Combinar as listas usando o operador + e imprimir o resultado
// TODO: Imprimir a soma da lista combinada usando o método de extensão Sum()
}
}
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