Scott
Scott

Reputation: 465

Java Class Inheritance and comparing subclass objects

I'm working on a homework assignment, and I'm having a really hard time wrapping my head around how to compare two of the same subclass objects. Basically I have this superclass 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) {

    }
}

And then I have a subclass Currency that extends Magnitude ( I am only allowed to override the lessThan() method):

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);
   }
}

What exactly is the way that I should implement these methods for the super and subclass so that I can compare 2 objects of the same subclass?

Upvotes: 0

Views: 1297

Answers (3)

Radu Ionescu
Radu Ionescu

Reputation: 3532

You can make use of the fact that you can call lessThan() also from m and use this as the other argument.

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);
}

}

You then need to have

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);
}
}

Upvotes: 2

Roberto Linares
Roberto Linares

Reputation: 2225

If I understand your question correctly, you want to know how to implement and override the lessThan() method in your Currency class, knowing you can only compare currencies but not magnitudes, but what you receive is a Magnitude type parameter.

In that case, you need to check if the Magnitude object you received as a paramether is actually an instance of Currency wrapped in a Magnitude class. To do that, you use the instanceof comparison operator and then cast the object to 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");
    }
 }

Upvotes: 0

carborgar
carborgar

Reputation: 171

Simply rewrite the methods at the subclass.

Now, if you create two instances of the subclass and compare them, it'll use the subclass method

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

To use parent's class method, use this way c1.lessThan((Magnitude) c2);

See this form more info.

Upvotes: 0

Related Questions