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

Usando a orientação a objetos organize um programa que apresenta o cenário para o usuário:
https://www.csuchico.edu/anthmuseum/_assets/documents/nasa-exercise-survival-on-the-moon.pdf
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