Tópicos Especiais

Chrysthian Simão

Orientação a Objetos com C#

Material das aulas

(e vantagens de um nome complicado)

https://github.com/chrysthian

https://slides.com/chrysthian

Convenções do CH

(e da disciplina)

  • Codificar em inglês
     
  • Formatter é a critério do aluno (um pouco mais sobre isso, logo mais)
     
  • Apresentar os trabalhos em um repositório do GIT (se você não tem um, vamos criar e aprender a usar juntos)
     
  • Os temas dos trabalhos são a critério de vocês, podem usar quaisquer recursos para construir eles desde que consiga defender seu projeto na frente da turma

Revisão dos exercícios

Exercício 1

 

Escrever um algoritmo que receba a altura e a largura de um retângulo e calcule a sua área.​

Exercício 2

 

Crie um algoritmo que permita fazer três conversões monetárias. O algoritmo deve receber o valor em real (R$) e apresentar os valores convertidos em:

 

  • Dólar (1 dólar = 5,17 reais)
  • Euro (1 euro = 6,14 reais)
  • Peso argentino (1 peso argentino = 0,05 reais)

Exercício 3

 

Desenvolver um algoritmo para ler o valor inteiro da idade de uma pessoa e imprimir uma das mensagens:

 

  • se idade <= 13: Criança
  • se idade > 13 e <= 18: Adolescente
  • se idade > 18 e <= 60: Adulto
  • se idade > 60: Idoso

Exercício 4

Criar um algoritmo que receba um valor positivo inteiro e imprima a sequência Fibonacci até o valor lido. Por exemplo: caso o usuário insira o número 15, o programa deve imprimir na tela os números 0, 1, 1, 2, 3, 5, 8, 13.

Orientação a Objetos com C#

O que é, onde vive, o que come?

Códigos simples como escrevemos até agora são relativamente fáceis de acompanhar.

 

Mas conforme a complexidade cresce, uma organização maior se faz necessária, não vamos fazer só uma tripa de código num Main.cs e dar como encerrado.

Orientação a Objetos ao resgate!

Organizar códigos complexos e tornar eles legíveis para as outras pessoas se torna essencial, mesmo num time de só uma pessoa.

  • Classes

  • Objetos

Princípios de OO

Classe

É a definição, o planejamento, do que será construído.

 

Um paralelo é o arquiteto que desenha a planta de uma casa, as definições, dimensões, cômodos estão lá, mas não se pode morar na planta.

Objeto

Quando criamos algo concreto baseado na classe.

 

Seguindo a analogia, quando criamos uma casa baseada na planta.

 

Importante notar que várias casas podem surgir de uma mesma planta.

Classes e Objetos

// isso é uma Classe
class House {
	string Color { get; set; }
    bool HasGarage { get; set; }
}

// aqui criamos os objetos
class Main{
    public static void main(String args[]){  
        House house1 = new House();
        House house2 = new House();
        House house3 = new House();
        House house4 = new House();
        
        house1.color = "white";
        house2.color = "orange";
        house3.color = "yellow";
        house4.color = "white";
        
        house1.HasGarage = true;
    }   
}  

Classes e Objetos

class Car {
	string Model { get; set; }
    string Name { get; set; }

    void Accelerate(){
		Console.WriteLine("Car -> accelerate");
    }
}

class Main{
    public static void main(String args[]){  
        Car obj = new Car();
        obj.Accelerate();
    }   
}  
  • Herança

  • Abstração

  • Encapsulamento

  • Polimorfismo

Princípios de OO

Herança

Permite definir classes baseadas em outras classes, trazendo o conceito de separação de responsabilidades.

 

A associação é representada como, um carro *é um* veículo, ou seja tudo o que uma classe veículo tiver, um carro também terá.

Classe pai (ex. Shape)

Classe filha (ex. Circle)

Herança

Herança


class Shape {
	public float Area { get; set; }
	public float Perimeter { get; set; }
}


class Circle : Shape {
	public float Radius { get; set; }
}

Abstração

Conhecer somente informações necessárias de um objeto em termos simples.

 

Define características que obrigatoriamente deverão estar presentes ao implementar a classe.

 

Usamos o modificador abstract.

Isso é uma classe (abstrata)!

TAMBÉM são classes!

Abstração

// classe abstrata
abstract class Shape {
	public float Area { get; set; }
	public float Perimeter { get; set; }
    
    abstract float CalculateArea();
}

// classe que NÃO é abstrata
class Circle : Shape {
	public float Radius { get; set; }
}

Abstração

abstract class Vehicle {
	public string Name { get; set; }
	public string Model { get; set; }

    abstract void Accelerate();  
}

Abstração

abstract class Vehicle {
	string Name { get; set; }
	string Model { get; set; }

    virtual void Accelerate() {
    	Console.WriteLine("Vehicle -> accelerate");
    };  
}

Abstração + Herança

class Car : Vehicle {  
    void override Accelerate(){
		Console.WriteLine("Car -> accelerate");
    }
}

class Main{
    public static void main(String args[]){  
        Car obj = new Car();
        obj.Accelerate();
    }   
}  

Encapsulamento

É o conceito de expor somente  características necessárias de uma classe, ocultando complexidades desnecessárias.

 

A associação com cápsulas de medicação são naturais, porque ao tomar um medicamento você não precisa saber a composição dele, mas precisa saber o propósito, dosagem e efeitos colaterais

Encapsulamento

 

Seguindo o exemplo do nosso carro é como se houvessem funções que tratassem toda a complexidade química da queima de combustível e a transformação dele em energia.

 

Um motorista não precisa saber dessas complexidades para usar um carro.

Encapsulamento

Esse efeito é alcançado usando os modificadores public, private e protected.

 

Importante notar que C# tem uma notação específica para nomear variáveis de acordo com a combinação destes modificadores

Encapsulamento

Encapsulamento

class Car : Vehicle{
	string Color { get; private set; }

    private void BurnFuel() {
    	// método altamente complexo
    }

    void Accelerate(){
	    BurnFuel();
		Console.WriteLine("Car -> accelerate");
    }
}

Polimorfismo

Polimorfismo permite que métodos com o mesmo nome tenham comportamentos diferentes baseados em contexto.

Polimorfismo

abstract class Animal
public abstract Speak()

Speak()
// oinc!

Speak()
// meow!

Speak()
// moo!

Polimorfismo

Com a nossa analogia de um carro, também podemos ter um méodo Accelerate() e Accelerate(int speed) serão chamados de acordo com os parâmetros que informarmos quando realizarmos a chamada

Polimorfismo

class Car : Vehicle {
	int Speed { get; private set; }

    void Accelerate() {
		Speed++;
    }
    
    void Accelerate(int speed) {
		Speed += speed;
    }
}

class Main {
    public static void main(String args[]) {  
        Car obj = new Car();
        obj.Accelerate();
        obj.Accelerate(2);
    }   
}  

Sobrecarga de operadores

Podemos se aplicar a retornos distintos também, mas isso não é polimorfismo, chamamos esse comportamento sobrecarga de operadores e a difrença *não pode* ser apenas o tipo de retorno.

Sobrecarga de Operadores

public void MyMethod(string arg) 
{
	// awesome
}

public int MyMethod(string arg, int arg2) 
{
	// awesome
	return 0;
}

Construtor

São definições usadas para inicializar as variáveis do nosso objeto.

 

Este padrão também faz uso de polimorfismo, podendo ter múltiplos construtores para múltiplas situações.

Construtores

class Car : Vehicle {

   private string brand;
   private string model;

   public Car() {
      this.brand = "honda";
      this.model = "civic";
   }


   public Car(string brand, string model ) {
      this.brand = brand;
      this.model = model;
   }
}

class Main {
    public static void main(String[] args) {  
        Car obj1 = new Car();
        Car obj2 = new Car("Chevrolet", "Celta");
    }   
}  

ToString

Esse é um método que todos os objetos do C# herdam, ele descreve os objetos em linguagem humana formatados para exibição.

 

Isso é útil para debug e uso em métodos como Console.WriteLine(), ele pode (e normlamente deve) ser sobrescrito.

ToString

using System;

public class Object1
{
}


public class Example
{
   public static void Main()
   {
      object obj1 = new Object1();
      Console.WriteLine(obj1.ToString());
   }
}

ToString

class Car : Vehicle {

   private string brand;
   private string model;

   public Car() {
      this.brand = "honda";
      this.model = "civic";
   }


   public override string ToString() {
      return this.brand + " " + this.model;
   }
}

class Main {
    public static void main(String args[]) {  
        Car obj = new Car();
		Console.WriteLine(obj2.ToString());
    }   
}  

Array

string[] cars;
string[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
int[] myNum = {10, 20, 30, 40};

Permite armazenar uma coleção de variáveis do mesmo tipo ao invés de precisar declarar uma a uma

Array

using System;

class Program
{
  static void Main(string[] args)
  {
    string[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
    Console.WriteLine(cars[0]);
  }
}

Importante notar que o primeiro índice é 0!

Array

using System;

class Program
{
  static void Main(string[] args)
  {
    string[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
    for (int i = 0; i < cars.Length; i++) 
    {
       Console.WriteLine(cars[i]);
    }
  }
}

Navegando pelos itens de um array

Array

Posso fazer um array de objetos? SIM!

Ver o exemplo ArrayOfObjects.cs

Cores pra facilitar a sua vida

  public void Awesome()
  {
    Console.BackgroundColor = ConsoleColor.Red;
    Console.ForegroundColor = ConsoleColor.White;
    Console.WriteLine("Fundo vermelho, letras brancas");
    Console.ResetColor();
  }

Um pequeno truque

  public void Definevalores()
  {
    Console.WriteLine("Qual o modelo do seu carro?");
    modelo = Console.ReadLine() ?? "";
    Console.WriteLine("Qual o ano do seu carro?");
    ano = Console.ReadLine() ?? "";
  }

O operador "??" impede valores nulos, da seguinte forma:
SE o valor informado for nulo, no lugar informe a segunda instrução

Referências e reforço

Let's get Ready to Rumble!

Calculadora geométrica

Crie um programa de console que tenha uma classe abstrata "Shape" e exiba a *área* e *perímetro* das seguintes formas geométricas:

  • Círculo
  • Triângulo
  • Retângulo

Calculadora geométrica (retângulo)

Area: largura * altura

Perímetro: 2 * (largura + altura)

Calculadora geométrica (Círculo)

Area: PI * raio ao quadrado

Perímetro: 2 * PI * raio

Calculadora geométrica (Triângulo)

a1: largura da aresta 1

a1: largura da aresta 2

a1: largura da aresta 3

semiperímetro s =  (a1 + a2 + a3)/2

 

Area:

area = raiz quadrada(s * (s - a1) * (s - a2) * (s - a3))

 

Perímetro: soma da largura das 3 arestas

Experimento Nasa

Experimento Nasa

  • É necessário armazenar os itens em uma classe separada
     
  • Permita o usuário selecionar item a item em ordem de importância
     
  • Apresente a pontuação final calculando individualmente cada item

Experimento Nasa

Apresente o resultado nas cores:

  • 0-32 : verde
  • 33-55 : amarelo
  • > 55: vermelho

 

Tópicos Especiais 2

By Chrysthian Simão

Tópicos Especiais 2

  • 183