Reputation: 45
This is for my university class.
I have this top-level abstract class, Expression.java (provided by the professor):
public abstract class Expression {
public abstract int eval();
public abstract String toString();
}
BinaryExpression.java (also provided by the professor), which extends Expression.java:
public abstract class BinaryExpression extends Expression {
protected Expression left;
protected Expression right;
public BinaryExpression (Expression l, Expression r) {
left = l;
right = r;
}
public abstract int eval();
public abstract String toString();
}
And finally Add.java (I wrote this) extends BinaryExpression.java:
public class Add extends BinaryExpression {
//Fields
protected Expression left;
protected Expression right;
//Constructor
public Add(Expression l, Expression r) {
left = l;
right = r;
}
//Methods
public int eval() {
return left.eval()+right.eval();
}
public String toString() {
return left + "+" + right;
}
}
The tester, Test.java, was provided as well. There are three other classes that extend BinaryExpression, Subtract, Multiply, and Divide, but they are virtually the same as Add. Plus and Minus just store a value, either negative or positive.
public class Test {
public static void main (String [] args) {
Expression s1 = new SimpleExpression(10);
Expression s2 = new SimpleExpression(-3);
System.out.println("s1: " + s1 + " = " + s1.eval());
System.out.println("s2: " + s2 + " = " + s2.eval());
Expression u1 = new Plus(s2);
Expression u2 = new Minus(s1);
System.out.println("u1: " + u1 + " = " + u1.eval());
System.out.println("u2: " + u2 + " = " + u2.eval());
Expression b1 = new Add(u1, s2);
Expression b2= new Subtract(s1, u2);
Expression b3= new Multiply(u1, b1);
Expression b4= new Divide(u2, b3);
System.out.println("b1: " + b1 + " = " + b1.eval());
System.out.println("b2: " + b2 + " = " + b2.eval());
System.out.println("b3: " + b3 + " = " + b3.eval());
System.out.println("b4: " + b4 + " = " + b4.eval());
Expression e = new Minus( new Multiply(b3, b2));
System.out.println("e: " + e + " = " + e.eval());
// example given in the assignment
e = new Divide(new Add(new Minus(new SimpleExpression (10)),
new SimpleExpression (50)),
new Minus(new Multiply(new SimpleExpression(5),
new Minus (new SimpleExpression (3)))));
System.out.println("Another e: " + e + " = " + e.eval());
}
}
When I compile Test.java, I get this error (and a similar one for Subtract, Multiply, and Divide):
./Add.java:8: cannot find symbol
symbol : constructor BinaryExpression()
location: class BinaryExpression
public Add(Expression l, Expression r) {
What's happening?
Upvotes: 0
Views: 4223
Reputation: 280167
The root cause is here
public Add(Expression l, Expression r) {
left = l;
right = r;
}
Your child class is trying to implicitly invoke a parameterless super constructor. Your parent class does not have such a parameterless constructor. So, instead, invoke its existing constructor
public Add(Expression l, Expression r) {
super(l, r);
left = l;
right = r;
}
Also, you're redeclaring left
and right
fields in the Add
class. There's no point doing this. Your child class already has access to the left
and right
fields of its parent class, BinaryExpression
.
Upvotes: 4