[Resolvido]Duvida - usar equals() para comparar objetos de classes diferentes

12 respostas
JonasZzZz

Olá,
como eu sobrescrevo o equals() para que ele compare o conteudo 2 objetos do mesmo tipo de classes distintas?

por exemplo:

class Exemplo{
   public static void main(String args[]){
      Quadrado q = new Quadrado(5);
      Retangulo r = new Retangulo(5);

      System.out.println(q.equals(r));
      System.out.println(r.equals(q));
   }
}

class Quadrado{
//equals() sobrescrito
}

class Retangulo{
//equals() sobrescrito
}

seria possível usar interface?

Desde já, agradeço.

12 Respostas

peczenyj

Pessoalmente eu criaria uma interface quadrilateros que tanto o quadrado quanto o retangulo implementam.

Ai vc poderia comparar se um quadrilatero é igual ao outro em um equals que receba um outro quadrilatero. Nesse caso vc compararia os tamanhos A e B ( que no caso do quadrado são iguais) ou poderia pensar em algo mais elaborado, afinal um trapezio é um quadrilatero tb (ai vc poderia comparar/calcular as diagonais).

É só uma ideia… :wink:

JonasZzZz

peczenyj:
Pessoalmente eu criaria uma interface quadrilateros que tanto o quadrado quanto o retangulo implementam.

Ai vc poderia comparar se um quadrilatero é igual ao outro em um equals que receba um outro quadrilatero. Nesse caso vc compararia os tamanhos A e B ( que no caso do quadrado são iguais) ou poderia pensar em algo mais elaborado, afinal um trapezio é um quadrilatero tb (ai vc poderia comparar/calcular as diagonais).

É só uma ideia… ;-)

hum… entendi… eu pensei em fazer desse jeito também

mas o problema mesmo nao é como funcionaria…

o que eu não consigo fazer é sobrescrever o equals() de modo que ele compare 1 quadrado com 1 retângulo( por exemplo comparar um método calculaArea())… é mais no código que eu tô perdido.

[]'s

claudneto

então vc queria implementar o métodos equals() pra ser usado do seu jeito?

JonasZzZz

Exatamente… me expliquei mal…

Eu queria fazer algo assim:

class Quadrado{
//calculaArea(){...}
// construtor Quadrado(lado1,lado2)...
//equals() sobrescrito que comparasse a area com a de outro objeto...
}

class Retangulo{
//calculaArea(){...}
// construtor Retangulo(lado1,lado2)...
//equals() sobrescrito que comparasse a area com a de outro objeto...
}

class Exemplo{
  public static void main(String args[]){
     Retangulo r = new Retangulo(2,8);
     Quadrado q = new Quadrado(4,4);
     
     System.out.println(r.equals(q));
     System.out.println(q.equals(r));
  }
}

obrigado…

joca_java

Jonas, nada impede de você fazer com que o equals compare objetos diferentes.

Mas pessoalmente, eu faria o que o peczenyj indicou… criaria uma interface quadriláteros e no seu equals, calcularia a área…
no caso você quer que eles sejam iguais se possuirem a mesma área né isso? Então fica aí a sugestão.

[]´s

JonasZzZz

joca_java:
Jonas, nada impede de você fazer com que o equals compare objetos diferentes.

Mas pessoalmente, eu faria o que o peczenyj indicou… criaria uma interface quadriláteros e no seu equals, calcularia a área…
no caso você quer que eles sejam iguais se possuirem a mesma área né isso? Então fica aí a sugestão.

[]´s

acho que entendi… vou tentar aqui…

obrigado.

[]'s

pedrovds

Cria uma classe Quadrilatero com o método equals() implementado nela, e nas classes Quadrado e Retangulo voce herda de Quadrilatero..

É o meu primeiro post, espero ter ajudado..

:wink:

public class Quadrilatero {
	
	private int base;
	private int altura;
	
	public Quadrilatero(int base, int altura){
		this.base = base;
		this.altura = altura;
	}
	
	public boolean equals(Quadrilatero quadrilatero){
		if (this.base == quadrilatero.getBase() &&
				this.altura == quadrilatero.getAltura()){
                // Ou já chama o método calculaArea() aqui dentro.
			return true;
		}else{
		return false;
		}
	}
	
	public int getBase(){
		return this.base;
	}
	
	public int getAltura(){
		return this.altura;
	}

}
pedrovds

Completando,

Coloca essa classe Quadrilatero como abstrata e o metodo abstract calculaArea() dentro dela e o implementa nas classes filhas (Quadrado e Retangulo). Assim voce vai poder chamar o método de dentro do equals() e comparar os objetos direto pela área…

[]'s

JonasZzZz
pedrovds:
Cria uma classe Quadrilatero com o método equals() implementado nela, e nas classes Quadrado e Retangulo voce herda de Quadrilatero..

É o meu primeiro post, espero ter ajudado..

:wink:

public class Quadrilatero {
	
	private int base;
	private int altura;
	
	public Quadrilatero(int base, int altura){
		this.base = base;
		this.altura = altura;
	}
	
	public boolean equals(Quadrilatero quadrilatero){
		if (this.base == quadrilatero.getBase() &&
				this.altura == quadrilatero.getAltura()){
                // Ou já chama o método calculaArea() aqui dentro.
			return true;
		}else{
		return false;
		}
	}
	
	public int getBase(){
		return this.base;
	}
	
	public int getAltura(){
		return this.altura;
	}

}

Brigadão cara...

mas o problema é que aí você está usando uma sobrecarga do equals(), e não reescrevendo o equals()...

tem que ser tipo:

public boolean equals(Object obj){...}

[]'s

Jaba

O problema, Jonas, é que um Quadrado nunca vai ser um Retãngulo. Eu não vejo uma maneira de comparar dois objetos distintos, se o Equals compara objetos.

Eu faria com uma Classe Abstrata, usando um método abstrato que Comparasse suas SubClasses.
Ai o Equals compararia as Variaveis de Instancia de Dois Objetos que Pertencem a Mesma Hierarquia, entendeu?

class Exemplo{   
   public static void main(String args[]){   
      Quadrado q = new Quadrado(5);   
      Retangulo r = new Retangulo(5);   
  
      System.out.println(q.equals(r));   
      System.out.println(r.equals(q));   
   }   
}   

abstract class Forma{

   private int tamanhoX;
   private int tamanhoY;
   final boolean equals(Forma obj) {
      if (this.tamanhoX == obj.tamanhoX && this.tamanhoY == obj.tamanhoY) {
          return true;
      } else {
          return false;
      }
   }

}   
 
class Quadrado extends Forma{   
//equals() sobrescrito   
}   
  
class Retangulo extends Forma{   
//equals() sobrescrito   
}
JonasZzZz

Jaba:
O problema, Jonas, é que um Quadrado nunca vai ser um Retãngulo. Eu não vejo uma maneira de comparar dois objetos distintos, se o Equals compara objetos.

Você pode sobrescrever o Equals, e comparar as Variaveis de Instancia de Dois Objetos, entendeu?

Acho que é isso o que eu quero… hehe

O que eu quero é sobrescrever o equals() para comparar a area de um objeto com a de outro… não importando o seu tipo…

Algo do tipo “se o quadrado tem area 5 e o retangulo tem area 5 -> retorne true, se nao -> false”…

o que eu não to conseguindo é sobrescrever o equals(Object obj)… eu tô perdido no codigo…
se alguém puder só fazer um esboço do equals()… seria bom :slight_smile:

sou iniciante em java… :frowning:

[]'s

JonasZzZz

Obrigado a todos... consegui fazer!!

usei interface e deu certo...

class Retangulo implements IQuadrilatero{

	double base, altura;


	Retangulo(double base, double altura){
		this.base = base;
		this.altura = altura;
	}

	public double calcularArea(){
		return this.base * this.altura;
	}

	public String toString(){
		return String.valueOf(this.calcularArea());
	}

	public boolean equals(Object obj){

		IQuadrilatero r = (IQuadrilatero) obj;

		if(this.calcularArea() == r.calcularArea()){
		return true;
		}
		return false;
	}
}

era uma duvida muito besta... agora que eu vi :?

Criado 19 de setembro de 2008
Ultima resposta 19 de set. de 2008
Respostas 12
Participantes 6