我正在开发一个项目,但遇到了一些问题。我需要测试子类(DiscountProduct)的相等性。 类之间的关系可以理解为:Order 类有一个 Product,Product 是 DiscountProduct 的父级。我想测试 DiscountProduct 是否相等。任何帮助深表感谢。谢谢你! 下面是代码:
订单类别:
public class Order implements Comparable<Order>{
private int quantity;
//composition has-a relationship
private Product product;
public Order(int quantity, Product product) {
this.quantity = quantity;
this.product = product;
}
public boolean equals(Object obj){
if (obj instanceof Order) {
return product.equals(obj) && quantity == ((Order) obj).quantity;
}
return false;
}
public Product getProduct() {
return product;
}
}
产品类别
public class Product implements Comparable<Product> {
private String productCode;
private String description;
private int unitPrice; //pence
public Product(String productCode, String description, int unitPrice) {
this.productCode = productCode;
this.description = description;
this.unitPrice = unitPrice;
}
//equals method to test product for equality.
public boolean equals(Object obj){
if (this == obj){
return true;
}
if (obj == null || !(obj instanceof Product)){
System.out.println("-");
return false;
}
Order other = (Order) obj;
if (!productCode.equals(other.getProduct().getProductCode()))
return false;
if (!description.equals(other.getProduct().getDescription()))
return false;
if (unitPrice != (other.getProduct().getUnitPrice()))
return false;
return true;
}
}
折扣产品类别
public class DiscountProduct extends Product {
private double discountRate;
public DiscountProduct(String productCode, String description, int unitPrice, double discountRate) {
super(productCode, description, unitPrice);
this.discountRate = discountRate;
}
//equals method to test discount product for equality.
public boolean equals(Object obj){
Order other = (Order) obj;
//how to test for the equality for the discountProduct's field discountRate?
//does I need to add some method in Order class to get the discountRate of object of Order class,
//because relation is 'Order has Product' and then there is a parent-child relation
//between product and DiscountProduct class.
}
}
最佳答案
DiscountProduct
可以执行以下操作:
@Override // always always always use that annotation when overriding!
public boolean equals(Object obj){
.. this == obj test
if (obj == null || !(obj instanceof DiscountProduct)){
return false;
}
if (super.equals(obj)) {
cast to DiscountProduct and check discountRate
这里的要点是:
- 您确实只希望同一类的对象相等。否则,您很有可能得到必要的
if a.equals(b) then b.equals(a)
规则错误 - 那么你想重用父类的现有实现
- 最后,比较子类字段
将 equals()
的“最后”版本声明为 final
也可能有意义,但这实际上取决于上下文.
关于java - Java中如何测试子类的相等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59530424/