Interfaces – Java, C++ e C#

Publicado: 18 de fevereiro de 2014 em C#, C/C++, Java

Os objetos definem sua interação com o mundo exterior através dos métodos que eles expõem. Métodos formam a interface do objeto com o mundo exterior; os botões na parte frontal do seu aparelho de televisão, por exemplo, são a interface entre você e a fiação elétrica do outro lado do seu invólucro de plástico. Você aperta o botão “Power” para ligar e desligar a televisão.

Na sua forma mais comum, uma interface é um conjunto de métodos relacionados com corpos vazios

A implementação de uma interface permite que uma classe se torne mais formal sobre o comportamento que promete proporcionar. Interfaces formam um contrato entre a classe e o mundo exterior, e este contrato é imposto em tempo de compilação.

Se sua classe reivindica implementar uma interface, todos os métodos definidos por essa interface deve aparecer em seu código-fonte antes da classe ser compilada com sucesso.

Uma Interface obriga a classe na qual foi implementada a cumprir o que nela foi declarado. Caso não cumpra o determinado pela interface obterá o seguinte erro de compilação:

Java: The type [Classe] must implement the inherited abstract method [Metodo da interface] [Classe.java]

C++: Error 1 error C2259: ‘Classe’ : cannot instantiate abstract class.

C#: Error 1 ‘namespace.classe’ does not implement interface member ‘namespace.classe.metodo(tipo).

Conceito de interfaces

  • Não pode ser instanciada (não podemos criar objetos com new).
  • Só pode possuir assinaturas de métodos de instância, públicos e abstratos (sem corpo).
  • Não pode possuir métodos concretos (com corpo), nem métodos estáticos.
  • Não pode conter variáveis de instância ou de classe (Static);
  • Pode conter declarações de constantes.
  • Pode ser criada como sub interface de outra interface já existente.

Uso Comum de Interface

Na linguagem de programação C++ pode se utilizar uma interface abstrata como o exemplo abaixo, mas este uso não é muito comum, pois a convenção de classes C++ já contempla que a interface seja separada da implementação na criação da própria classe, utilizando arquivos diferentes (.h e .cpp). Além da linguagem C++ permitir múltiplas heranças tornando raro a necessidade do uso de interfaces abstratas.

Java e C# utilizam a interface pois não permitem múltiplas heranças, então a interface se torna necessária para criar um efeito deste tipo, por exemplo, imagine que temos a classe Casa e queremos que esta classe herde as classes Portas e Janelas, isto não será possível em Java e C#, mas é possível em C++.

Para garantir que teremos os métodos paras portas e janelas na classe Casa, precisamos utilizar a interface Portas e a Interface Janelas, ainda não garantindo como em C++ os tipos de portas e janelas já que as interfaces são abstratas e não métodos concretos, Mas este recurso permite que a classe Casa tenha obrigatoriamente, portas e janelas de qualquer tipo.

Este também é o motivo de uso de uma interface abstrata em C++, quando precisar utilizar métodos abstratos para uma classe dizendo que você permite portas e janelas de qualquer tipo. Nota-se assim que C++ é uma linguagem mais flexível em termos de recursos na criação de objetos.

Exemplos:

Neste exemplo uma pequena empresa fictícia de desenvolvimento de jogos esta escrevendo um novo jogo, um desenvolvedor defini a logica do jogo e cria as interfaces para as classes primitivas. Cria uma interface chamada: Ação, que defini todas as ações do personagem. Enquanto ele desenvolve outras interfaces do jogo, outros desenvolvedores escrevem as classes para os personagem, implementando a interface na classe primitiva do personagem. O programador que criou a interface garante que as classes terão todas as ações definidas por ele obrigatoriamente na classe: Personagem Primitivo, do qual será herdado outros personagens.

Java

Arquivo #1 – Principal

package org.desenvolvimentoaberto;

public class Principal  {

  public static void main(String[] args)
  {
     PersonagemPrimitivo Cidadao = new PersonagemPrimitivo();
     Cidadao.nome = "Jim James";
     Cidadao.classe = "Trabalhador";
     Cidadao.andar (false);
     Cidadao.correr(true);
     Cidadao.largar(false);
     Cidadao.pegar (true);
     Cidadao.atacar(true);

     System.out.println("Status ------>>>> ");
     System.out.println("O personagem:" + Cidadao.nome);
     System.out.println("Classe: " + Cidadao.classe);
   
    Cidadao.mostraPersonagem();

 }
}

Arquivo #2 – Interface

package org.desenvolvimentoaberto;

public interface Acao
 {

    void pegar(boolean pega);
    void largar (boolean larga);
    void andar (boolean anda);
    void correr (boolean corre);
    void atacar (boolean ataca);
 }

Arquvio #3 – Classe Personagem Primitivo

package org.desenvolvimentoaberto;

public class PersonagemPrimitivo implements Acao
 {
    private boolean pega  = false;
    private boolean larga = false;
    private boolean anda  = false;
    private boolean corre = false;
    private boolean ataca = false;
    public String nome;
    public String classe;

    public void pegar (boolean pega)
    {
      this.pega = pega;
    }

    public void largar (boolean larga)
    {
      this.larga = larga;
    }

    public void andar (boolean anda)
    {
      this.anda = anda;
    }

    public void correr (boolean corre)
    {
      this.corre = corre;
    }

    public void atacar (boolean ataca)
    {
      this.ataca = ataca;
    }

    public void mostraPersonagem()
    {
       System.out.println("Esta andando:  " + anda);
       System.out.println("Esta correndo: " + corre);
       System.out.println("Esta pegando:  " + pega);
       System.out.println("Esta largando: " + larga);
       System.out.println("Esta atacando: " + ataca);
    }
 }

C++

Arquivo #1 – Principal

#include "stdafx.h"
#include <iostream>
#include <string>
#include "personagemprimitivo.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
 {
    PersonagemPrimitivo Cidadao;

    Cidadao.nome = "Jim James";
    Cidadao.classe = "Trabalhador";
    Cidadao.andar(false);
    Cidadao.correr(true);
    Cidadao.largar(false);

    Cidadao.pegar(true);
    Cidadao.atacar(true);

    cout << "Status ------>>>> " << endl;
    cout << "O personagem:" + Cidadao.nome << endl;
    cout << "Classe: " + Cidadao.classe << endl;
  
    Cidadao.mostraPersonagem();
  
    system("pause");
    return 0;
 }

Arquivo #2 – Interface

#include "stdafx.h"

__interface  Acao
{
 public:

   virtual void pegar(bool pega);

   virtual void largar(bool larga);

   virtual void andar(bool anda);
 
   virtual void correr(bool corre);

   virtual void atacar(bool ataca);

 };

Arquvio #3 – Classe Personagem Primitivo

#include "stdafx.h"
#include <iostream>
#include "acao.h"

using namespace std;

class PersonagemPrimitivo : public Acao {

private:

   bool pega = false;
   bool larga = false;
   bool anda = false;
   bool corre = false;
   bool ataca = false;

public:  string nome;  string classe;

  void pegar(bool pega)
  {
     this->pega = pega;
  }

  void largar(bool larga)
  {
     this->larga = larga;
  }

  void andar(bool anda)
  {
     this->anda = anda;
  }

  void correr(bool corre)
  {
     this->corre = corre;
  }

  void atacar(bool ataca)
  {
     this->ataca = ataca;
  }

void mostraPersonagem()  {

      cout << "Esta andando:  " << anda  << endl;
      cout << "Esta correndo: " << corre << endl;
      cout << "Esta pegando:  " << pega  << endl;
      cout << "Esta largando: " << larga << endl;
      cout << "Esta atacando: " << ataca << endl;
  }
 };

C#

Arquivo #1 – Principal

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto {

 class Program   {

   static void Main(string[] args)     {
   
      PersonagemPrimitivo Cidadao = new PersonagemPrimitivo();

      Cidadao.nome = "Jim James";
      Cidadao.classe = "Trabalhador";
      Cidadao.andar (false);
      Cidadao.correr(true);
      Cidadao.largar(false);
      Cidadao.pegar (true);
      Cidadao.atacar(true);

      Console.WriteLine("Status ------>>>> ");
      Console.WriteLine("O personagem:" + Cidadao.nome);
      Console.WriteLine("Classe: " + Cidadao.classe);
      Cidadao.mostraPersonagem();
      Console.ReadKey();

     }
  }
}

Arquivo #2 – Interface

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto
 {

   interface Acao   {

      void pegar(Boolean pega);

      void largar(Boolean larga);

      void andar(Boolean anda);

      void correr(Boolean corre);

      void atacar(Boolean ataca);
    }
 }

Arquvio #3 – Classe Personagem Primitivo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto
 {
     class PersonagemPrimitivo : Acao
     {
         private Boolean pega = false;
         private Boolean larga = false;
         private Boolean anda = false;
         private Boolean corre = false;
         private Boolean ataca = false;

         public String nome;
         public String classe;

         public void pegar(Boolean pega)
         {
             this.pega = pega;
         }

         public void largar(Boolean larga)
         {
             this.larga = larga;
         }

         public void andar(Boolean anda)
         {
             this.anda = anda;
         }

         public void correr(Boolean corre)
         {
             this.corre = corre;
         }

         public void atacar(Boolean ataca)
         {
             this.ataca = ataca;
         }

         public void mostraPersonagem()
        {
            Console.WriteLine("Esta andando:  " + anda);
            Console.WriteLine("Esta correndo: " + corre);
            Console.WriteLine("Esta pegando:  " + pega);
            Console.WriteLine("Esta largando: " + larga);
            Console.WriteLine("Esta atacando: " + ataca);
        }
    }
}
comentários
  1. mateus disse:

    legal, obrigado

Deixe um comentário