所以场景如下:
class Feline
{
String name;
int age;
equals(Object obj) {...}
hashCode(){...}
}
class Cat extends Feline
{
int teeth;
hashCode(){...}
equals(Object obj)
{
if (!super.equals(obj))
{
return false; //If I don't want this should I use
}
...
}
}
问题实际上这种继承是正确的,但对于程序来说,它不一定是真的。我对此的想法是Cat
实际上应该由Feline
对象组成。问题是,我应该采取以下哪种方法?
EDIT
这是Eclipse的实现,默认为equals / hashcode。可能是equals的实现并不是最准确的方法。
答案 0 :(得分:9)
在继承面前进行Ohoh平等检查。这非常难以正确而且需要很长时间来描述。
正确的解决方案不像人们想象的那样直截了当,所以请转到read this - 这应该清除所有问题。如果没有随意再问:)
编辑:所以作为上述链接的简短摘要:一个相等方法应该满足以下属性:
为了保证这一点,我们需要指定另一种方法:public boolean canEqual(Object other)
。如果另一个对象是(重新)定义canEqual的类的实例,则此方法应返回true,否则返回false。
换句话说,如果我们覆盖equal()
本身,则必须始终覆盖该方法。实现本身是微不足道的,一个简短的例子:
class Foo {
public boolean canEqual(Object other) {
return other instanceof Foo;
}
// equals implementation, etc.
}
equals方法本身必须首先检查给定对象是否可以等于自身,例如类似于other.canEqual(this) && restOfComparison
。
扩展上述Foo的类的简短示例:
class Bar extends Foo {
public boolean equals(Object other) {
if (other instanceof Bar) {
Bar that = (Bar)other;
return that.canEqual(this) && otherStuff;
}
return false;
}
public boolean canEqual(Object other) {
return other instanceof Bar;
}
}
答案 1 :(得分:0)
我不使用eclipse,所以我从未见过这个实现。我猜这在很多情况下都很有意义。
删除它并从头开始编写自己没有问题。在这种情况下,我仍然觉得使用继承感觉很舒服。
我不会非常担心你要遵循的这些指导方针,而只是做现在有意义的事情。您无法预测未来所有需求的变化。请列出测试用例并验证您的设计是否适合您当前所知的测试用例。
答案 2 :(得分:0)
如果从类中继承,如果Feline已经通过检查失败,则您的Cat类不能相等。那是什么
if (!super.equals(obj))
{
return false; //If I don't want this should I use
}
一样。如果Feline返回true,它没有说什么。如果它正确实施,它将检查类平等,然后你只需要检查牙齿。
默认实现只提供了确定“不平等”的快捷方式。为了坚持你的榜样,猫永远是猫,所以如果Feline说我在这里不是猫科动物(即犬科动物),那么你可以放心它不能成为一只猫。但是,如果它是肯定的是它的猫科动物,那么由你来决定猫是猫(猫)还是老虎。
答案 3 :(得分:-1)
除非每个孩子都是父母,否则我通常不建议继承。你必须问问自己,猫的每个实例真的都是猫科动物吗?