Programação Orientada a Objetos (POO) - I

Programação Orientada a Objetos (POO)

Orientação a objetos é um paradigma de programação organizado através de objetos. Isto é, quando utilizamos POO, estamos facilitando a forma de compreensão e implementação de um projeto. Porque, simplesmente estamos se preocupando na forma em que as informações são definidas, como característica e comportamentos, e como elas se relacionam entre si.

Para ficar mais fácil, precisamos analisar o contexto de um  projeto. Como exemplo utilizarei um time de futebol.

Classes

Classes organizam características e comportamentos comuns a um grupo de informações.

Sendo assim podemos definir que todas as pessoas em um time de futebol, fazem parte da classe Pessoa.  Pois, todas elas possuem características e comportamentos comuns.

Classe Pessoa

 POO-jogadores  Características

  • Nome
  • Idade
  • Salário

Comportamentos

  • Participa dos jogos
  • Participa dos treinos
 
[sourcecode language="csharp"]
public class Pessoa
{
public string nome;
public int idade;
public decimal salario;

public void participarJogo()
{

}

public void participarTreino()
{

}
}
[/sourcecode]

Atributos

São as características de cada objeto. Como: Nome, Idade, Situação e Salário.

[sourcecode language="csharp"]
public string nome;
public int idade;
public decimal salario;

[/sourcecode]

Métodos

São comportamentos de cada objeto. Como: Participar do jogo e Participar do treino.

[sourcecode language="csharp"]
public void participarJogo()
{

}

public void participarTreino()
{

}

[/sourcecode]

Objetos

São instancias de uma classe. Ou seja, sendo que definimos uma Classe Pessoa possui características como: Nome, Idade, Situação e Salário e comportamentos como: Participar do jogo e Participar do treino. Ao instanciar um objeto desta classe, devemos cria-lo segundo as definições da classe que ele está sendo gerado.

Por exemplo:

Pessoas - Time Futebol

  Tipo do objeto:PessoaCaracterísticas

  • Nome: Neymar
  • Idade: 19 anos
  • Salário: 800.000,00

Comportamentos

  • Participa dos jogos
  • Participa dos treinos
[sourcecode language="csharp"]
//Istanciação do objeto
Pessoa pes_Neymar = new Pessoa();

//Atribuição de valores aos atributos
pes_Neymar.nome = "Neymar";
pes_Neymar.idade = 19;
pes_Neymar.salario = 8000000;

//Execução dos métodos
pes_Neymar.participarJogo();
pes_Neymar.participarTreino();

[/sourcecode]

Método Construtor

Para estanciar um objeto, utilizamos o método construtor da classe. Método construtor deve ter exatamente o mesmo nome da classe e não devem possuir um tipo de retorno na sua definição. Porque, ele já é responsável por retornar um objeto do tipo da classe que pertence.

[sourcecode language="csharp"]
public class Pessoa
{
public int idade;

protected string nome;

private decimal salario;

//Método construtor
public Pessoa()
{
//Possui o mesmo nome da classe
//Não possui um tipo de retorno
}

public void participarJogo()
{

}

public void participarTreino()
{

}
}

[/sourcecode]

Herança

É a generalização das informações. Ou seja, dentro de um time de futebol temos dois tipos de pessoas: jogadores e o técnico. E cada um desses tipos, possui algumas características e comportamentos, comuns e outras diferentes.

Um jogador, além de possuir as outras características de pessoas, possui também quantidade de gols marcados, peso, velocidade e o comportamento de marcar gol.

Um técnico, além de possuir as outras características de pessoas, possui também técnicas de treino e o comportamento de marcar treino.

Para atender a este tipo de situação, podemos criar duas classes diferentes, mas herdando características e comportamentos comuns, definidos na classe Pessoa.

Pessoas - Time Futebol

Jogadores

Técnico

   
 
[sourcecode language="csharp"]
public class Jogador : Pessoa
{
public int qtdeGolMarcado;
public decimal peso;
public int velocidade;

public void marcarGol()
{

}
}

[/sourcecode]

[sourcecode language="csharp"]
public class Tecnico : Pessoa
{
public string tecnicasTreino;

public void marcarTreino()
{

}
}

[/sourcecode]

Sobrecarga

São como comportamentos comuns, na vida real. Mas com algumas particularidades, que os diferem.

Na POO, são métodos com o mesmo nome, mas com a assinatura dos parâmetros diferentes.

[sourcecode language="csharp"]
public void marcarTreino(string local)
{
//Marca o treino definindo apenas o local
}

public void marcarTreino(string local, int horario)
{
//Marca o treino definindo o local e o horário
}

public void marcarTreino(string local,int horario, int qtdJogadores)
{
//Marca o treino definindo o local, horário e quantidade de jogadores
}

[/sourcecode]

Referência this

Especifica que estamos referenciando apenas as características e métodos da própria classe.

Por exemplo, se eu passo por parâmetro a quantidade de gols marcado em uma partida, com o mesmo nome, da propriedade qtdeGolMarcado, existente na classe. Para especificar qual é variável, que representa minha propriedade existente na classe, devo utilizar o prefixo this.

[sourcecode language="csharp"]
public void marcarGol(int qtdeGolMarcado)
{
this.qtdeGolMarcado = qtdeGolMarcado;
}

[/sourcecode]

Modificadores de Acesso

Um modificador de acesso determina até onde o atributo ou método pode ser visualizado, ou seja,  determinam quais os locais ele pode ser usado. Eles são o utilizados no encapsulamento. Temos pelo menos 3 tipos de modificadores de acesso padrões, na maioria das linguagens POO:

public Acesso não é restrito. Membro é acessado de qualquer lugar.
protected Pode ser acessado dentro da classe que o define e pelas classes que a herdam.
private Membro pode ser a cessado somente dentro da classe que o define.
 
[sourcecode language="csharp"]
public int idade;

protected string nome;

private decimal salario;
[/sourcecode]

Por enquanto é isto. No próximo artigo continuarei com outros conceitos de POO.