Java类继承和比较子类对象

时间:2016-09-14 15:56:52

标签: java oop inheritance

我正在完成一项家庭作业,我很难绕过如何比较两个相同的子类对象。 基本上我有这个超级级Magnitude:

class Magnitude {
    public boolean lessThan(Magnitude m) {

    }
    public boolean lessThanEqualTo(Magnitude m) {

    }
    public boolean equalTo(Magnitude m) {

    }
    public boolean greaterThan(Magnitude m) {

    }
    public boolean notEqual(Magnitude m) {

    }
}

然后我有一个扩展Magnitude的子类Currency(我只允许覆盖lessThan()方法):

class Currency extends Magnitude {
   double amount;

   public Currency(double amt) {
       this.amount = amt;
   }

   @Override
   public boolean lessThan(Magnitude m) {
      Currency other_currency = (Currency) m;

      if (this.amount < other_currency.amount) {
          return true;
      }
      else {
         return false
      }
   }

   public void print() {
       System.out.println(amount);
   }
}

我应该为super和subclass实现这些方法的方式是什么,以便我可以比较同一个子类的2个对象?

3 个答案:

答案 0 :(得分:2)

您可以利用以下事实:您也可以从lessThan()拨打m并使用this作为另一个参数。

abstract class Magnitude {
public abstract boolean lessThan(Magnitude m);

public boolean lessThanEqualTo(Magnitude m) {
     return this.lessThan(m) || this.equalTo(m);
}
public boolean equalTo(Magnitude m) {
     return ((!this.lessThan(m))&&(!m.lessThan(this)));
}
public boolean greaterThan(Magnitude m) {
    return m.lessThen(this);
}
public boolean notEqual(Magnitude m) {
    return !this.equal(m);
}

}

然后你需要

class Currency extends Magnitude {
double amount;

public Currency(double amt) {
    this.amount = amt;
}

@Override
public boolean lessThan(Magnitude m) {
  Currency other_currency = (Currency) m;

  if (this.amount < other_currency.amount) {
      return true;
  }
  else {
     return false
  }
}

public void print() {
   System.out.println(amount);
}
}

答案 1 :(得分:0)

只需重写子类的方法。

现在,如果您创建子类的两个实例并进行比较,它将使用子类方法

Currency c1 = new Currency(); Currency c2 = new Currency(); c1.lessThan(c2); //will call Currency.lessThan method

要使用父类的方法,请使用此方法 c1.lessThan((Magnitude) c2);

请参阅this表格了解详情。

答案 2 :(得分:0)

如果我正确理解您的问题,您想知道如何在lessThan()课程中实施和覆盖Currency方法,因为您知道只能比较货币而不能比较货币,但您收到的是Magnitude类型参数。

在这种情况下,您需要检查作为参数收到的Magnitude对象是否实际上是Currency类中包含的Magnitude实例。为此,您使用instanceof comparison operator,然后将对象强制转换为Currency

@Override
 public boolean lessThan(Magnitude m) {
    if(m instanceof Currency) {
        return this.amount < ((Currency)m).amount;
    } else {
        throw new IllegalArgumentException("Parameter is not a Currency");
    }
 }