Dúvida com interfaces

7 respostas
danielbussade

Boa tarde a todos da lista:

Sou iniciante em Java e estou estudando interface quando surgiu algumas dúvidas, e preciso da ajuda de vocês.
O meu código ta definido da seguinte forma:

interface AreaCalculavel { 
  double calculaArea ();
}

public class Quadrado implements AreaCalculavel {
	
	private int lado;
	
	public Quadrado(int lado) {
		this.lado=lado;
	}

	public double calculaArea() {
		return this.lado * this.lado;
	}
}

public class Retangulo implements AreaCalculavel {
	private int largura;
	private int altura;

	public Retangulo(int largura, int altura) {
		this.altura = altura;
		this.largura = largura;
	}

	public double calculaArea() {
		return this.largura * this.altura;
	}
}


 public class Teste {
	public static void main(String[] args) {
		Retangulo re = new Retangulo(3, 2);
		Circulo cc= new Circulo(5);
		System.out.println(re.calculaArea());
		System.out.println(cc.calculaArea());	
	}
}

Aqui surgiu minha dúvida qual a diferença em usar
AreaCalculavel ac= new Retangulo(3,2) e
Retangulo re = new Retangulo(3, 2);

Att

7 Respostas

T

De modo geral, prefira usar para declarar variáveis e parâmetros a interface, não a classe que a implementa.

Em termos de tempo de execução (que seria na prática a única diferença), a diferença é desprezível ou mesmo inexistente nas modernas JVMs.

danielbussade

A minha intenção era realmente saber a diferença na prática. Mas vou seguir seu conselho e declarar sempre a interface,e nao a classe.

Obrigado!

T

A vantagem de usar a interface, em vez da classe concreta, é que você pode substituir a implementação e não amarrar o programa demais à classe concreta.

danielbussade

Desculpe não entendi muito bem o lance de substituir a implementação.
Se eu substituir a implementação da classe retangulo com Retangulo re= new Retangulo (3,2) , seria substituida da mesma forma que com AreaCalculavel ac= new Retangulo(3,2).

Poderia me explicar melhor!

Att

peczenyj

AreaCalculavel ac= new Retangulo(3,2);

Vejamos, se Retangulo implementa a inteface AreaCalculavel, então vc tem um objeto que responde aos mesmos métodos que AreaCalculavel, porém apenas para eles.

Ele é um Retangulo, mas também é uma AreaCalculavel. Vc veria diferença se a classe Retangulo tivesse outro metodo que não fosse o de calculaArea();

T

danielbussade:
Desculpe não entendi muito bem o lance de substituir a implementação.
Se eu substituir a implementação da classe retangulo com Retangulo re= new Retangulo (3,2) , seria substituida da mesma forma que com AreaCalculavel ac= new Retangulo(3,2).

Poderia me explicar melhor!

Att

Nesse seu caso você não consegue enxergar o problema.

Vou dar um exemplo mais concreto, sem ser de programação.

Digamos que você tenha um televisor modelo Sony TVC-2987 CRT. Então ele:

  • Pertence à classe SonyTVC2987Wega
  • Implementa a interface Televisor, que estende as seguintes interfaces (por exemplo):
    • Alimentacao110V
    • AceitaTVCabo
  • Para instanciar isso (fora o fato de que você tem de adquirir a TV…), você faz algo como:

Televisor tv = new SonyTVC2987Wega();

ou talvez

Televisor tv = Class.forName (“SonyTVC2987Wega”).newInstance(); // neste caso você poderia ter pegado o nome da classe
// a partir de um arquivo de configuração

não isto:

SonyTVC2987Wega tv = new SonyTVC2987Wega();

Se você quiser trocar seu televisor por um Philips PBD-2203 LCD, você não precisa trocar TODAS as declarações no seu programa por

PhilipsPBD2203LCD tv = new PhilipsPBD2203LCD ();

basta criar a nova TV com :

Televisor tv = new PhilipsPBD2203LCD ();

ou melhor ainda,

Televisor tv = Class.forName (“PhilipsPBD2203LCD”).newInstance();

danielbussade

Agora ficou um pouco mais claro!

Eu consigo ganhar polimorfismo com
AreaCalculavel ac= new Retangulo(3,2);

Obrigado a todos!

Criado 1 de outubro de 2007
Ultima resposta 1 de out. de 2007
Respostas 7
Participantes 3