Chrysthian Simão
(e vantagens de um nome complicado)
https://github.com/chrysthian
https://slides.com/chrysthian
(e da disciplina)
Escrever um algoritmo que receba a altura e a largura de um retângulo e calcule a sua área.
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:
Desenvolver um algoritmo para ler o valor inteiro da idade de uma pessoa e imprimir uma das mensagens:
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.
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.
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
É 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.
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.
// 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;
}
}
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
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)
class Shape {
public float Area { get; set; }
public float Perimeter { get; set; }
}
class Circle : Shape {
public float Radius { get; set; }
}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!
// 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; }
}abstract class Vehicle {
public string Name { get; set; }
public string Model { get; set; }
abstract void Accelerate();
}abstract class Vehicle {
string Name { get; set; }
string Model { get; set; }
virtual void Accelerate() {
Console.WriteLine("Vehicle -> accelerate");
};
}class Car : Vehicle {
void override Accelerate(){
Console.WriteLine("Car -> accelerate");
}
}
class Main{
public static void main(String args[]){
Car obj = new Car();
obj.Accelerate();
}
}
É 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
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.
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
class Car : Vehicle{
string Color { get; private set; }
private void BurnFuel() {
// método altamente complexo
}
void Accelerate(){
BurnFuel();
Console.WriteLine("Car -> accelerate");
}
}Polimorfismo permite que métodos com o mesmo nome tenham comportamentos diferentes baseados em contexto.
abstract class Animal
public abstract Speak()
Speak()
// oinc!
Speak()
// meow!
Speak()
// moo!
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
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);
}
} 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.
public void MyMethod(string arg)
{
// awesome
}
public int MyMethod(string arg, int arg2)
{
// awesome
return 0;
}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.
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");
}
} 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.
using System;
public class Object1
{
}
public class Example
{
public static void Main()
{
object obj1 = new Object1();
Console.WriteLine(obj1.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());
}
} 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
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!
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
Posso fazer um array de objetos? SIM!
Ver o exemplo ArrayOfObjects.cs
public void Awesome()
{
Console.BackgroundColor = ConsoleColor.Red;
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Fundo vermelho, letras brancas");
Console.ResetColor();
} 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
Crie um programa de console que tenha uma classe abstrata "Shape" e exiba a *área* e *perímetro* das seguintes formas geométricas:
Area: largura * altura
Perímetro: 2 * (largura + altura)
Area: PI * raio ao quadrado
Perímetro: 2 * PI * raio
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
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
Apresente o resultado nas cores: