java – 继承 – 在子类中使用super.equals(),它覆盖在超类的equ
我一直在测试代码并偶然发现了一个问题:你应该调用子类中的super.equals()方法,它可以覆盖超类的equals()方法中使用的一些方法吗?
我们考虑以下代码: 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(),她甚至说:
但是,当子类覆盖某些方法时,我认为这是非常不可预测的.例如,当我使用equals比较2个DiscountedItem对象时,调用super方法并将item.getPrice()动态调度到子类DiscountedItem中的正确方法,而使用变量直接访问其他价格值. 那么,这真的取决于我(因为我应该正确地实现该方法)还是有办法绕过它? 解决方法
直接比较实例变量,而不是将实例变量与其相关的getter方法进行比较.
例如,改变 && price == item.getPrice()) 至 && this.price == item.price) getter方法是不必要的,因为私有实例变量只能在类结构之外访问. 注意: 我之前推荐过以下内容: && 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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |