Dúvida com Interfaces

5 respostas
colored

Boa noite tenho tentado entender direito como e quando usar interfaces, sei que tem varios tópicos a esse respeito por aqui, mas estou com várias dúvidas.

Seguindo o desenho de Pessoa, Cliente, Funcionario… Tenho visto que muito se diz, evite herança prefira composição…
Mas isso está me trazendo uma confusão enorme, por exemplo caso eu tenha em meu sistema Clientes e Funcionarios que sejam tanto Pessoa Fisica quanto Pessoa Juridica.

no primeiro esquema que modelei ficou assim…

public abstract class Pessoa{

}

public class PessoaFisica extends Pessoa{

}

public class PessoaJuridica extends Pessoa{

}

public class Cliente {

      private Pessoa pessoa;

}

Até ai tranquilo mas seguindo a ideia de nao utilizar herança, pensei mais ou menos assim e pelo que consegui entender nos artigos que li…

public Interface Pessoa{

}

public class Cliente implements Pessoa{

}

Neste Exemplo da Interface como eu poderia fazer pra distinguir se o meu Cliente é Pessoa Fisca ou Pessoa Juridica???

se Alguem puder ajudar ficaria muito agradecido :smiley:

Falow

5 Respostas

Paulo_Dias

Eae cara,

vejamos se consigo ajudar:

Primeiro sobre interfaces, eu penso em interfaces como contratos, se uma classe precisa ser utilizada como uma Pessoa ela tem que assinar o contrato( implements ) e cumprir o contrato, fazendo o que uma pessoa precisa fazer( os metodos que temos que criar para essa interface ). Ex. Se uma classe PessoaFisica assina um contrato para ser uma Pessoa( implments ) e cumpri esse contrato, ela é uma Pessoa e pode ser usada em todo lugar que seja necessário uma Pessoa, não importa como ela cumpri esse contrato, só importa que ela cumpri!

No caso de composição, trata-se de um principio de projeto para facilitar modificações futuras. Ex. Se a classe Funcionario já extends Pessoa, se no futuro for extremamente necessário que Funcionario extends outra classe, não será possível, pois java não têm herança multipla. Para ver esse principio( composição ) funcionando procure pelos padrões de projetos( observer, strategy… )

No seu primeiro exemplo acho que existe composição. A Classe Cliente têm uma pessoa e essa pessoa pode ser PessoaJuridica ou PessoaFisica( ou qualquer outra que extends Pessoa ). No caso de no futuro inventarem um outro tipo de Pessoa a classe Cliente não precisa ser modificada, basta criar a nova classe( principio open/close) e Cliente já estará de acordo com a nova modificação.

No caso do seu segundo exemplo, é preciso avaliar PessoaFisica e PessoaJuridica, se elas fazem coisas diferentes acho que elas deveriam ter contratos( interfaces ) diferentes.

Espero ter ajudado.

d34d_d3v1l

Eu até ia comentar…
Mas o Paulo Dias disse tudo.

Só uma coisa, classes abstratas não podem ser instanciadas,
então no caso não poderá ter um tipo “Pessoa” sendo “Pessoa”.
kkkkkk

abrazz

shenn

Segue um exemplo simples de interface

public interface Pessoa {

	public void comprar();
	
	public void pagar();
		
}
public class PessoaJuridica implements Pessoa{

	@Override
	public void comprar() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void pagar() {
		// TODO Auto-generated method stub
		
	}

}
public class PessoaFisica implements Pessoa{

	@Override
	public void comprar() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void pagar() {
		// TODO Auto-generated method stub
		
	}

}
colored

Só uma coisa, classes abstratas não podem ser instanciadas,
então no caso não poderá ter um tipo “Pessoa” sendo “Pessoa”.
kkkkkk

abrazz

To ligado. Ali vai qualquer classe que extender de pessoa

@paulodias opa claro q ajudo mano, explicou mto bem.
Mas tipo minha duvida eh tipo digamos q eu precisa ter as duas classes
Pessoafisica e pessoajuridica eh melhor estenderem a abstrata ou implmentar a interface,
Por que com a classe eu conseguiria manter os dois tipo em uma única tabela anotando ela como single table
E com a interface acho q n teria como ou teria?

colored

Então tenho lido muito a respeito disso, vi q heranca só eh “aceito” quando quem herda eh um tipo especial da classe pai. E q algumas pessoas dizem q o legal eh vc saber mesclar os dois.

Será q assim n ficaria ok?

public abstract class Pessoa{

}

public class PessoaFisica extends Pessoa {

}

public class PessoaJuridica extends Pessoa {

}

public class Cliente {

   private Pessoa pessoa;

}

Assim quem fosse pessoa fisica quanto jurídica eu colocaria composição de pessoa.
Mas assim eu não teria polimorfismo de pessoa em cliente não eh?

Criado 25 de abril de 2012
Ultima resposta 26 de abr. de 2012
Respostas 5
Participantes 4