gpt4 book ai didi

java - 继承 - 在子类中使用 super.equals() 覆盖父类(super class) equals 中使用的方法

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:27:29 28 4
gpt4 key购买 nike

我一直在测试代码并偶然发现了一个问题:你是否应该在子类中调用 super.equals() 方法来覆盖 equals()< 中使用的一些方法 父类(super class)的方法?

让我们考虑以下代码:

public abstract class Item {
private int id;
private float price;

public Item(int id, String name, float price, String category) {
this.id = id;
this.name = name;
this.price = price;
this.category = category;
}

public int getID() {
return id;
}

public float getPrice() {
return price;
}

@Override
public boolean equals(Object object){
if(object instanceof Item){
Item item = (Item) object;
if( id == item.getID()
&& price == item.getPrice())
{ return true; }
}
return false;
}
}

和子类 DiscountedItem:

public class DiscountedItem extends Item {
// discount stored in %
private int discount;

@Override
public boolean equals(Object object) {
if(object instanceof DiscountedItem){
DiscountedItem item = (DiscountedItem) object;
return (super.equals(item)
&& discount == item.getDiscount()
);
}
return false;
}

public int getDiscount() {
return discount;
}

@Override
public float getPrice() {
return super.getPrice()*(100 - discount);
}
}

我一直在重读 Angelika Langer's secrets of equals() ,她甚至说:

There is agreement that super.equals() should be invoked if the class has a superclass other than Object.

但我认为子类何时会覆盖某些方法是高度不可预测的。例如,当我使用 equals 比较 2 个 DiscountedItem 对象时,会调用 super 方法,并且 item.getPrice() 会动态分派(dispatch)到子类 DiscountedItem 中的正确方法,而另一个价格值是使用变量直接访问的。

那么,这真的取决于我(因为我应该正确实现该方法)还是有解决办法?

最佳答案

直接比较实例变量,而不是将实例变量与其相关的 getter 方法进行比较。

例如,改变

&& price == item.getPrice())

&& this.price == item.price)

getter 方法是不必要的,因为私有(private)实例变量只能在类结构之外访问。


注意:

我之前推荐过以下内容:

&& this.getPrice() == item.getPrice())

虽然它适用于问题的示例,但它并不适合所有情况。考虑子类 DiscountedItem 是否这样声明方法 getPrice:

@Override
public float getPrice() {
return Math.floor(super.getPrice());
}

这会导致错误的等价:

DiscountedItem firstItem = DiscountedItem(1, "", 1.1, "");
DiscountedItem secondItem = DiscountedItem(1, "", 1.0, "");
firstItem.equals(secondItem); // Returns true despite different prices.

关于java - 继承 - 在子类中使用 super.equals() 覆盖父类(super class) equals 中使用的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20205268/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com