Orientação a Objetos

Classes

Classe são tipos de dados compostos por propriedades e métodos. Em resumo classes são objetos compostos onde instanciámos.
Modelo de Classe:

    Modificador de Classe class nome_Classe
    {
    
Especificador de Acesso tipo nome_variavel = ...;
Especificador de Acesso retorno nome_função(argumentos...) { comandos... }
}

Modificador de Classes

Codigo Função
Public Sem restrição de visualização.
Abstract Classe base, não pode ser instanciado objetos.
Sealed Classe não possui herdeiros.
Static Não permite que instanciem seus objetos ou membros.

Especificador de Acesso

Codigo Função
Public Sem restrição de acesso.
Private Só podem ser acessados pela própria classe.
Protected Podem ser acessados pela própria classe e nas derivadas.
Abstract Os metodos não podem ser implementados, somente cabeçalhos.
Sealed Classe não pode ser herdado.
Virtual O método deve ser redefinido em uma classe derivada.
Static O metodos pode ser chamado mesmo sem a instanciação de um objeto

Objetos

Objetos são os elementos criados a partir de uma classe.
Para isso utilizamos o operador new responsável por alocar um espaço de memoria especifico para a ocupação do objeto.

Construtores e Destrutores

Construtor

É responsável por iniciar um objeto quando instanciado. No C# quando não declarado um construtor o mesmo gera um construtor default.
Para definir um construtor basta criar um método com o mesmo nome da classe. Estrutura basica:

    namespace aguradorInstruções
    {
public class Objetos { public string nome; public int alturaCm; public int larguraCm; public int projundidadeCm;
public Objetos(string nm, int alCm, int lgCm, int pfCm) { nome = nm; alturaCm = alCm; larguraCm = lgCm; projundidadeCm = pfCm; }
}
class utilizando { static void Main() { Console.WriteLine("Qual sera o nome do objeto?"); string nomeou = Console.ReadLine(); Objetos o1 = new Objetos(nomeou); Console.WriteLine("Qual sera a altura do objeto?"); ... } }
}

Sobregarda de construtores se dá devido a uma serie de construtores com nomes iguais e funções semelhantes.

Destrutor

É responsável por eliminar uma objeto depois de realizado todas as atividades. Para informar um destrutor basta criar um método com o mesmo nome do construtor porem com um "~" na frente. Ainda é possivel passar um Console.WhiteLine(); para visualizar o objeto que esta sendo destruído.

public class Objetos { public string nome; public int alturaCm; public int larguraCm; public int projundidadeCm;
public Objetos(args...) {...}
~Objetos() {}
}

Ordem de Execução dos construtores

A Ordem de execução se da sempre a partir das bases e hierarquicamente para as derivadas.

Exemplo
    class Base  
{
    public Base()
    {
        Console.WriteLine("Construtor classe base");
    }
}
class Deriva1:Base
{
    public Deriva1()
    {
        Console.WriteLine("Construtor classe Deriva1");
    }
}
class Deriva2:Deriva1
{
    public Deriva2()
    {
        Console.WriteLine("Construtor classe Deriva2");
    }
}
class Aula37 { static void Main() { Deriva2 d2= new Deriva2(); } }
    Resultado da execução >>
        Construtor classe base
        Construtor classe Deriva1
        Construtor classe Deriva2
                        

Classe Static

Quando utilizamos classes do tipo static não podemos definir construtor pois não pode se declarar objetos de classe static, então todos os membros da classe também devem ser static. Em suma pode ser entendido como um elemento comum a todo o program uma vez que usa uma posição estática de memoria.

Operador THIS

Faz referencia a um método pai, criando uma associação coerente.
ex;

    
class Operacao { public int v1; public int v2;
public Operacao(int v1, int v2 ) { v1 recebe v1? como a maquina vai saber de qual você esta falando? this.v1 = v1; this.v2 = v2; }
}

Herança

Uma classe derivada, recebendo propriedades e métodos de uma classe base. Ainda sim uma classe mesmo sendo derivada possui seus membros próprios. Para referenciar uma classe pai basta usar um ":" seguido do nome da mesma.

    class Primata
    {
    
public bool bípede; public bool polegar_opositor; private bool auto_reconhece; private string alimentacao;
public Primata(string alimentacao) {this.alimentacao = alimentacao} public void reconhece() {auto_reconhece = true;} public void n_reconhece() {auto_reconhece = false;} }
    class Humano:Primata
    {
    
...
Tem acesso a tudo exceto ao private
string etnia;
public Humano(string etnia ):base("herbívoro") { reconhece(); this.etnia = etnia; }
}

A Utilização na classe Main();
    class Principal
    {
        static void Main()
        {
            Humano pessoa = new Humano("Latino");
        }
    }
                        

Já no caso da propriedade alimentacao ela é uma propriedade a ser iniciada pela classe filha, então, utilizamos o operador :base() para fazer a declaração de valor.

Heranças Encadeadas

Para encadear heranças basta fazer o mesmo processo de usar um ":" seguido do nome da base.

    class Individuo:Humano
    {
        public string personalidade;

        public Individuo():base("Latino")
        {
            personalidade = "neutra";
        }
    }
                    

Acessors Get e Set

Apesar de parecer um método é uma propriedade especial, é utilizada para limitar a interação de um atributo private. Desta forma tera disponibilidade tanto de pegar um dado, quanto de setar um valor nele.
Definição:

    class Primata
    {
        private int vidaEstimada;


    
public int idadeM {
get{ return vidaEstimada;}
set{ vidaEstimada = value;}
}
public Primata() { idadeM= 108; } }

Usando get
    static void Main()
    {
        Humano pessoa = new Humano();

        Console.WriteLine("A idade max de um humano é {0}", pessoa.idadeM)
    }
                        
Usando set
    static void Main()
    {
        Humano pessoa = new Humano();

        pessoa.idadeM = 200;
    }
                        

Indexadores de Classes

Permite que o objeto seja utilizado como um Array.

    class Primata
    {
        private int[] vidaFases= new int[6]{0,9,18,27,36,45,54};


    
public int this[int i] {
get{ return vidaFases[i];}
set{ vidaFases[i] = value;}
}
public Primata() {} }

Usando
    static void Main()
    {
        Humano pessoa = new Humano();

        pessoa[2] = 300;

        Console.WriteLine("Idade:{0}", pessoa[2]);
    }
                        

Interfaces

Interfaces só implementam só os protótipos dos métodos, uma classe pode implementar diversas interfaces.
Características das Interfaces:


Implementando
    public interface Primata
    {
    
void nascer(); void morrer();
}
    public interface Homosapiens
    {
    
void evoluir();
}

Uma vez declarado metodos interface se faz necessário sua implementação na classe filha.
Usando
    class Pessoa:Primata, ...
    {
        public bool nascer;
        
        public Pessoa()
        {

        }
        
public void nascer() { this.nascer = true; }
public void morrer() { this.nascer = false; }
} static void Main() { Pessoa Pessoa1 = new Pessoa(); }

Estrutura

Basicamente Struct é um tipo que vai armazenar diferentes tipos de dados. Metodos Struct são acessados diretamente dispensando o uso do ref.
A estrutura deste tipo é muito semelhante a uma classe, mas, por não se tratar de uma classe ela não pode ser Herdada, ainda a mesma pode conter construtores.

Implementado
struct Primata { public string porte; public string raca; public string cor;
public Primata(string porte, string raca, string cor) { this.porte = porte; this.raca = raca; this.cor = cor; }
}
Usando
class aula44 { static void Main() {
Primata p1;
p1.porte = "grande"; p1.raca = "gorila"; p1.cor = "grafite"; Console.WriteLine("O animal {0} é de porte {1} e tem uma cor {2}", p1.raca, p1.porte, p1.cor); } }

Array de estruturas

Usando o mesmo principio de declaração de arrays basta evidenciar o tipo da lista.

Implementando
Primata[] macacos = new Primata[3];
Usando
macacos[0].porte = "grande"; macacos[0].raca = "gorila"; macacos[0].cor = "branco";
macacos[1].porte = "medio"; macacos[1].raca = "chimpanze"; macacos[1].cor = "branco";
macacos[2].porte = "pequeno"; macacos[2].raca = "mico"; macacos[2].cor = "branco";

Metodos retornando Objetos

Para um método retornar um objeto o construtor do objeto dever ser referenciado como retorno do metodo, por exemplo no lugar do void que significa sem retorno.

Implementação
class Bananeira { private string nomeB; private int numBanana; public Bananeira( string nomeB) { this.nomeB = nomeB; numOvo = 0; } public Banana botar() { return new Banana(); } }
class Banana { public Banana() { Console.WriteLine("Novo Cacho"); } }
Usando
class Usando
{
    static void Main()
    {
        Bananeira b1 = new Bananeira("First");
        b1.botar();
    }
}
                        


voltar