Recapitulação - Calculadora de Formas
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 30 de 70.
Desafio
FácilVamos construir uma calculadora de formas que reúne tudo o que você aprendeu sobre interfaces e polimorfismo. Você criará um sistema onde diferentes formas podem ser processadas uniformemente por meio de uma interface comum, demonstrando o poder do polimorfismo em tempo de execução.
Você organizará seu código em quatro arquivos:
IShape.cs: Defina uma interface chamadaIShapeno namespaceShapes. Cada forma deve ser capaz de calcular sua área e descrever a si mesma. Declare dois métodos:CalculateArea()retornando umdouble, eGetDescription()retornando umastring.Circle.cs: Crie uma classeCircleno namespaceShapesque implementaIShape. Um círculo possui uma propriedadeRadius(double) definida através de seu construtor. A fórmula da área éMath.PI * Radius * Radius. A descrição deve retornar"Circle with radius {Radius}".Rectangle.cs: Crie uma classeRectangleno namespaceShapesque implementaIShape. Um retângulo possui as propriedadesWidtheHeight(ambas double) definidas através de seu construtor. A área é simplesmente a largura vezes a altura. A descrição deve retornar"Rectangle {Width}x{Height}".Program.cs: No seu arquivo principal, crie um círculo e um retângulo usando valores de entrada e, em seguida, armazene-os em um array de referênciasIShape. Percorra o array e, para cada forma, imprima sua descrição seguida de sua área arredondada para duas casas decimais. Isso demonstra como você pode processar formas completamente diferentes através da mesma interface!
Você receberá três entradas:
- Raio do círculo (double)
- Largura do retângulo (double)
- Altura do retângulo (double)
Imprima a saída neste formato para cada forma:
{GetDescription() result}
Area: {CalculateArea() rounded to 2 decimal places}Por exemplo, se as entradas forem 5, 4 e 6, a saída deve ser:
Circle with radius 5
Area: 78.54
Rectangle 4x6
Area: 24.00Observe como seu loop não precisa saber se está lidando com um círculo ou um retângulo - ele simplesmente chama os métodos da interface e deixa o polimorfismo cuidar do resto. Esta é a elegância de programar para interfaces!
Experimente você mesmo
using System;
using Shapes;
class Program
{
public static void Main(string[] args)
{
// Ler valores de entrada
double circleRadius = Convert.ToDouble(Console.ReadLine());
double rectWidth = Convert.ToDouble(Console.ReadLine());
double rectHeight = Convert.ToDouble(Console.ReadLine());
// TODO: Criar um objeto Circle com o raio fornecido
// TODO: Criar um objeto Rectangle com a largura e altura fornecidas
// TODO: Criar um array de IShape contendo ambas as formas
// TODO: Percorrer o array e para cada forma:
// - Imprimir a descrição usando GetDescription()
// - Imprimir "Area: " seguido por CalculateArea() arredondado para 2 casas decimais
}
}
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