我正在完成一项家庭作业,我很难绕过如何比较两个相同的子类对象。 基本上我有这个超级级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个对象?
答案 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");
}
}