You are on page 1of 24

Anlise e Projeto OO

Aula 1.6 Interfaces

Prof. Bruno Moreno


bruno.moreno@ifrn.edu.br
Qual foi a causa do erro?

A classe DemoRobos exemplifica o uso de


/**
* A classe DemoRobos demonstra instncias das classes RoboSimples e RoboABateria.
instncias das classes RoboSimples e
* ESTA CLASSE NO PODE SER COMPILADA POR CAUSA DE ERROS INTENCIONAIS.
*/

RoboABateria;
class DemoRobos {

public static void main(String[] argumentos){


RoboSimples exp = new RoboSimples("Explorer",0,0,(short)90);
A classe no pode ser compilada por causa de
exp.move(10);
exp.mudaDireo((short)180);
exp.move();
// posio ser 0,10

// posio ser -1,10


um erro proposital: descubra qual !
exp.move();
System.out.println(exp);
// posio ser -2,10

RoboABateria walk = new RoboABateria("Walker",0,0,(short)90,111);


walk.move(10); // posio ser 0,10
walk.mudaDireo((short)180);
walk.move(); // posio ser -1,10
walk.move(); // posio ser -1,10 - no houve energia para
// modificar a posio
System.out.println(walk);

RoboAbstrato imag = new RoboAbstrato("Imaginrio",0,0,(short)180);


}

2
Interfaces

3
Introduo
A POO tem dois mecanismos de criao de
classes com descries de campos e mtodos
que devem ser implementados:
Classes abstratas;
Interfaces.

4
Introduo
A POO tem dois mecanismos de criao de
classes com descries de campos e mtodos
que devem ser implementados:
Classes abstratas;
Interfaces.

5
Interfaces
Classes abstratas podem ter mtodos no
abstratos
Esses mtodos so herdados e podem ser
utilizados por subclasses;
Se a classe no tiver nenhum mtodo no-
abstrato, podemos cri-la como uma interface;
Uma interface segue um modelo de declarao
diferente das classes;
Possui funcionalidade similar de classes
abstratas.

6
Interfaces
Assim como uma classe abstrata, uma interface
no pode ser instanciada;
Todos os mtodos de uma interface so
implicitamente abstract e public;
No podem ser declarados com seus corpos, i.e.
possuem apenas a descrio;
Se a interface tiver campos, estes so
implicitamente considerados como static e
final
Devem ser, portanto, inicializados na sua declarao.

7
Classes Abstratas vs Interfaces
Uma classe s pode herdar de uma nica
classe (abstrata ou no);
Uma classe pode implementar vrias interfaces
simultaneamente
Interfaces so um mecanismo simplificado de
herana mltipla em Java
Mais de uma interface determina os mtodos que
uma classe herdeira deve implementar.

8
Classes Abstratas vs Interfaces
Interfaces tambm podem ser teis para
implementar biblioteca de constantes
Uma vez que todos os campos de uma interface
devem ser declarados como static e final;
Pode-se escrever interfaces que somente tenham
campos
Qualquer classe que implementar essa interdace ter
acesso a estes campos.

9
Exemplo: ObjetoGeometrico
No exemplo a seguir iremos criar uma interface
para representar objetos gemtricos;
Nesse cenrio simplificado, todo objeto
geomtrico tem um centro e um permetro;
Criaremos uma interface chamada
ObjetoGeometrico que descrever quais
mtodos um objeto geomtrico deve ter;

10
Exemplo: ObjetoGeometrico
Antes disso, considere uma classe chamada
Ponto2D como se segue:
/**
* A classe Ponto2D encapsula um ponto no espao cartesiano de duas dimenses.
*/
class Ponto2D // declarao da classe
{
/**
* Declarao dos campos da classe
*/
private double x,y; // as coordenadas do ponto no espao bidimensional

/**
* O mtodo inicializaPonto2D recebe dois argumentos para inicializar os respectivos
* campos da classe Ponto2D. No existem restries aos valores que os dados podem
* receber, ento a inicializao se limita a copiar os argumentos para os campos.
* @param _x o argumento correspondente coordenada horizontal
* @param _y o argumento correspondente coordenada vertical
*/
public void inicializaPonto2D(double _x,double _y)
{
x = _x;
y = _y;
} // fim do mtodo inicializaPonto2D

// Continua no prximo slide...

11
Exemplo: ObjetoGeometrico
/**
* O mtodo Igual recebe uma instncia da prpria classe Ponto2D como argumento e
* verifica se as coordenadas encapsuladas na classe e na instncia que foi passada
* so exatamente iguais, e retorna o valor booleano true se forem.
* @param outroPonto2D outra instncia da prpria classe Ponto2D

Antes disso, considere uma classe chamada


* @return true se as coordenadas encapsuladas forem exatamente iguais s
* encapsuladas na instncia passada como argumento, false caso contrrio
*/

Ponto2D como se segue:


public boolean Igual(Ponto2D outroPonto2D)
{
if ((x == outroPonto2D.x) && // se as coordenadas horizontais forem iguais E
(y == outroPonto2D.y)) // se as coordenadas verticais forem iguais ento
return true; // o ponto igual, retorna true
else
return false; // o ponto diferente, retorna false
} // fim do mtodo Igual

/**
* O mtodo origem retorna uma nova instncia da classe Ponto2D, que contm as
* coordenadas (0,0) (origem das coordenadas). Esta instncia criada por este
* mtodo, e pode ser usada diretamente por aplicaes ou classes que executem
* este mtodo sem necessidade de usar a palavra-chave new.
* @return uma nova instncia da classe Ponto2D representando a coordenada (0,0)
*/
public Ponto2D origem()
{
Ponto2D temporrio = new Ponto2D(); // a inicializao da instncia feita aqui
temporrio.inicializaPonto2D(0,0);
return temporrio; // retornamos a referncia inicializada
} // fim do mtodo origem

// Continua no prximo slide...

12
Exemplo: ObjetoGeometrico
/**
* O mtodo clona retorna uma nova instncia da classe Ponto2D, que contm as
* mesmas coordenadas encapsuladas na classe, ou seja, quando este mtodo for
* executado a partir de uma instncia desta classe, ele retornar uma nova
* instncia com os mesmos valores encapsulados.
Antes disso, considere uma classe chamada
* @return uma nova instncia da classe Ponto2D contendo os valores encapsulados
*/
public Ponto2D clona()

Ponto2D como se segue:


{
Ponto2D temporrio = new Ponto2D(); // a inicializao da instncia feita aqui
temporrio.inicializaPonto2D(x,y); // os valores encapsulados so usados
return temporrio; // retornamos a referncia inicializada
} // fim do mtodo clona

/**
* O mtodo toString um mtodo "mgico" que no recebe argumentos, e retorna uma
* string contendo os valores dos campos da classe formatados.
* @return uma string com os valores dos campos formatados como (x,y)
*/
public String toString()
{
String resultado = "("+x+","+y+")";
return resultado;
} // fim do mtodo toString

} // fim da classe Ponto2D

13
Exemplo: ObjetoGeometrico
class Ponto2D {

public double x,y;

public void inicializaPonto2D(double _x,double _y) {


Antes disso, considere uma classe chamada
x = _x;
y = _y;
}

Ponto2D como se segue:


public boolean Igual(Ponto2D outroPonto2D) {
if ((x == outroPonto2D.x) && (y == outroPonto2D.y))
return true;
else
return false;
}

public Ponto2D origem() {


Ponto2D temporrio = new Ponto2D();
temporrio.inicializaPonto2D(0,0);
return temporrio;
}

public Ponto2D clona() {


Ponto2D temporrio = new Ponto2D();
temporrio.inicializaPonto2D(x,y);
return temporrio;
}

public String toString() {


String resultado = "("+x+","+y+")";
return resultado;
}
}

14
Exemplo: ObjetoGeometrico

Observe, agora, a interface ObjetoGeometrico:


/**
* A interface ObjetoGeometrico define que mtodos de um objeto geomtrico genrico
* bidimensional deve conter. Esta interface no declara nenhum campo.
*/
interface ObjetoGeometrico {
/**
* O mtodo centro retorna o ponto em duas dimenses que corresponde ao centro
* do objeto geomtrico.
*/
Ponto2D centro();

/**
* O mtodo calculaArea calcula a rea do objeto geomtrico e retorna a rea
* como um valor do tipo double.
*/
double calculaArea();

/**
* O mtodo calculaPerimetro calcula o permetro do objeto geomtrico e retorna o
* permetro como um valor do tipo double.
*/
double calculaPermetro();

} // fim da interface ObjetoGeometrico

15
Exemplo: ObjetoGeometrico

Observe, agora, a interface ObjetoGeometrico:


/**
* A interface ObjetoGeometrico define que mtodos de um objeto geomtrico genrico
* bidimensional deve conter. Esta interface no
*/
Interfaces
declara nenhum so declaradas com a
campo.

interface ObjetoGeometrico { palavra-chave interface e no


/**
com a palavra-chave class.
* O mtodo centro retorna o ponto em duas dimenses que corresponde ao centro
* do objeto geomtrico.
*/
Ponto2D centro();

/**
A declarao dos mtodos em uma
interface eretorna
* O mtodo calculaArea calcula a rea do objeto geomtrico feita como
a reaa declarao
* como um valor do tipo double.
*/
de mtodos em uma classe
double calculaArea(); abstrata, mas sem o modificador
/**
abstract;
* O mtodo calculaPerimetro calcula o permetro doNenhum mtodo em
objeto geomtrico uma ointerface
e retorna
* permetro como um valor do tipo double.
*/
pode ter corpo;
double calculaPermetro();

} // fim da interface ObjetoGeometrico

16
Exemplo: ObjetoGeometrico

Observe, agora, a interface ObjetoGeometrico:


/**
* A interface ObjetoGeometrico define que mtodos de um objeto geomtrico genrico
* bidimensional deve conter. Esta interface no
*/
Interfaces
declara nenhum so declaradas com a
campo.

interface ObjetoGeometrico { palavra-chave interface e no


/**
com a palavra-chave class.
* O mtodo centro retorna o ponto em duas dimenses que corresponde ao centro
* do objeto geomtrico.
*/
Ponto2D centro();

/** Os mtodos de uma interface so,


* O mtodo calculaArea calcula a rea do objeto geomtrico e retorna a rea
* como um valor do tipo double. implicitamente, abstract e
*/
double calculaArea();
public;
Mtodos em interfaces no podem
/**
* O mtodo calculaPerimetro calcula o permetro
ter modificadores como static e
do objeto geomtrico e retorna o
* permetro como um valor do tipo double. private;
*/
double calculaPermetro();

} // fim da interface ObjetoGeometrico

17
Exemplo: ObjetoGeometrico

Observe, agora, a interface ObjetoGeometrico:


/**
* A interface ObjetoGeometrico define que mtodos de um objeto geomtrico genrico
* bidimensional deve conter. Esta interface no declara nenhum campo.
*/ Interfaces no podem ter
interface ObjetoGeometrico {
/** construtores;
* O mtodo centro retorna o ponto em duas dimenses que corresponde ao centro
* do objeto geomtrico. Assim como em classes, interfaces
*/
Ponto2D centro(); podem utilizar outras classes como
/**
argumentos ou tipos de retorno;
* O mtodo calculaArea calcula a rea do objeto geomtrico e retorna a rea
* como um valor do tipo double.
*/
double calculaArea();

/**
* O mtodo calculaPerimetro calcula o permetro do objeto geomtrico e retorna o
* permetro como um valor do tipo double.
*/
double calculaPermetro();

} // fim da interface ObjetoGeometrico

18
Exemplo: ObjetoGeometrico

Observe, agora, a interface ObjetoGeometrico:


/**
* A interface ObjetoGeometrico define que mtodos de um objeto geomtrico genrico
* bidimensional deve conter. Esta interface no declara nenhum campo.
*/
interface ObjetoGeometrico {
/**
* O mtodo centro retorna o ponto em duas dimenses que corresponde ao centro
* do objeto geomtrico.
*/
Ponto2D centro();

/** Interfaces no podem ter


* O mtodo calculaArea calcula a rea do objeto geomtrico e retorna a rea
* como um valor do tipo double. construtores;
*/
double calculaArea();

/**
* O mtodo calculaPerimetro calcula o permetro do objeto geomtrico e retorna o
* permetro como um valor do tipo double.
*/
double calculaPermetro();

} // fim da interface ObjetoGeometrico

19
Exemplo: ObjetoGeometrico

A classe Circulo implementa a interface


ObjetoGeometrico:
/**
* A classe Circulo implementa a interface ObjetoGeometrico e representa um
* crculo. Esta classe encapsula o ponto central do crculo e seu raio. Todos os
* mtodos declarados na interface ObjetoGeometrico so implementados.
*/
class Circulo implements ObjetoGeometrico // declarao da classe
{
/**
* Declarao dos campos da classe
*/
private Ponto2D centro;
private double raio;

/**
* O construtor para a classe Circulo, que recebe argumentos para inicializar todos
* os campos da classe. Este o construtor "completo".
*/
Circulo(Ponto2D centro,double raio)
{
this.centro = centro; // Note o uso da palavra-chave this para marcar os campos
this.raio = raio; // da classe que tm o mesmo nome dos argumentos
}

// Continua no prximo slide...

20
Exemplo: ObjetoGeometrico
/**
* O mtodo centro retorna o ponto em duas dimenses que corresponde ao centro do
* crculo. Neste caso, basta retornar a instncia da classe Ponto2D que representa
* o prprio centro.
*/
public Ponto2D centro(){

A classe Circulo implementa a interface


return centro;
}

ObjetoGeometrico:
/**
* O mtodo calcularea calcula a rea do crculo e retorna a rea como um valor do
* tipo double.
*/
public double calcularea(){
return Math.PI*raio*raio; // pi vezes o quadrado do raio
}

/**
* O mtodo calculaPermetro calcula o permetro do crculo e retorna o permetro
* como um valor do tipo double.
*/
public double calculaPermetro(){
return 2.0*Math.PI*raio; // dois vezes pi vezes o raio
}

/**
* O mtodo toString retorna os valores dos campos do crculo formatados em uma
* string.
*/
public String toString(){
// Retorna diretamente uma string criada com os valores dos campos. O mtodo
// toString da classe Ponto2D chamado implicitamente.
return "Crculo com centro em "+centro+" e raio "+raio;
}
} // fim da classe Circulo

21
Exemplo: ObjetoGeometrico

A classe Circulo implementa a interface


ObjetoGeometrico:
class Circulo implements ObjetoGeometrico {
private Ponto2D centro;
private double raio;

Circulo(Ponto2D centro,double raio){


this.centro = centro;
this.raio = raio;
}

public Ponto2D centro(){


return centro;
}

public double calcularea(){


return Math.PI*raio*raio;
}

public double calculaPermetro(){


return 2.0*Math.PI*raio;
}

public String toString(){


return "Crculo com centro em "+centro+" e raio "+raio;
}
}

22
Exemplo: ObjetoGeometrico
Uma classe implementa uma interface
usando-se a palavra-chave
implements.
A classe Circulo implementa a interface Quando isso feito, se torna obrigatrio
que a classe Circulo implemente
ObjetoGeometrico:
class Circulo implements ObjetoGeometrico { TODOS os mtodos declarados em
private Ponto2D centro;
private double raio; ObjetoGeometrico.
Se a classe que implementa uma
Circulo(Ponto2D centro,double raio){
this.centro = centro; interface no implementa algum
this.raio = raio; mtodo da interface, essa classe pode
}
ser declarada como abstrata.
public Ponto2D centro(){
return centro;
}

public double calcularea(){


return Math.PI*raio*raio;
}

public double calculaPermetro(){


return 2.0*Math.PI*raio;
}

public String toString(){


return "Crculo com centro em "+centro+" e raio "+raio;
}
}

23
Exerccio (1)
Implemente uma classe Retangulo que
implementa ObjetoGeometrico;
Crie uma classe que seja capaz de instanciar
objetos de Circulo e de Retangulo
Faa essa classe imprimir os dados dos objetos
geomtricos instanciados.

24

You might also like