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 criar uma calculadora de formas que reúne tudo o que você aprendeu sobre interfaces e polimorfismo. Você criará um sistema no qual 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. Toda forma deve ser capaz de calcular sua área e descrever a si mesma. Declare dois métodos:CalculateArea(), que retorna umdouble, eGetDescription(), que retorna umastring.Circle.cs: Crie uma classeCircleno namespaceShapesque implementeIShape. Um círculo tem uma propriedadeRadius(double) definida por meio 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 implementeIShape. Um retângulo tem as propriedadesWidtheHeight(ambas double) definidas por meio de seu construtor. A área é simplesmente a largura multiplicada pela altura. A descrição deve retornar"Rectangle {Width}x{Height}".Program.cs: No 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 por meio 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 deverá 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 restante. Essa é 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étodosPratique por conta própria: Compilador de C# online