因此,这更多是一个概念性问题。
我有抽象类A
,类B
和C
扩展了A
。
B
和C
都在两个类中都只有1个实例变量,称为var
,并且都具有.getVar
方法。如果该对象是B
的实例,并且两个实例的B
值相等,则该对象等于var
的实例。 C
也是如此。
有没有一种方法可以在我的Abstract类中编写一个.equals(Object object)
方法,这样我就不必在两个类中编写基本上具有相同功能的相同方法了?
答案 0 :(得分:0)
假设A
具有abstract
和getVar()
都提供实现的B
方法C
,我们可以在A#equals
中利用它当两个对象相等时。因为只有类型B
的对象可以等于另一个类型B
的对象(C
也是如此),所以我们可以简单地比较每个对象的类;如果类别不同,则它们不能相等。
// You didn't specify what type 'var' is.
// B and C both have an implementation for this method.
public abstract T getVar();
@Override
public final boolean equals(Object o) { // Is final so B and C can't override it.
if (o == null) {
return false;
}
if (getClass() != o.getClass()) {
// This will ensure that B cannot be equal to C or A, and vice versa.
return false;
}
// o must be of the type B or C, so it's safe to cast to A here.
return getVar().equals(((A) o).getVar());
}
答案 1 :(得分:0)
基本上,您正在寻找的似乎是在父类getVar
中定义抽象方法A
并在子类B
和{{1 }},并根据C
返回的值使用父类的equals
方法。每个子类对于getVar
都有不同的返回类型,这使情况变得复杂。
解决方案是使getVar
成为通用类,允许A
本身的返回类型是通用的。然后,您可以简单地引用getVar
中的getVar
方法,而不必担心其特定类型:
equals
在上面的示例中,您会注意到public abstract class A<T> {
public abstract T getVar();
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + getVar().hashCode();
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
A<?> other = (A<?>) obj;
return getVar().equals(other.getVar());
}
}
返回通用类型getVar
。在定义子类时将指定该名称:
T
仅此而已!除非您选择在子类中专门重写public class B extends A<Integer> {
private int var = 0;
public B(int var) { this.var = var; }
@Override
public Integer getVar() { return var; }
}
public class C extends A<String> {
private String var = "";
public C(String var) { this.var = var; }
@Override
public String getVar() { return var; }
}
,否则在子类的实例上调用equals
时,它将退回到A
中声明的方法。完整的测试用例包括在下面。
.equals