I have a Shape method that has two arguments first is the width and the second is the height. I have two subclasses, one is the rectangle and another is triangle. I want to call the area() the method defined in both triangle and rectangle with the help of the area() of the Shape class. I have written this piece of code but when I am calling the area() method of derived classes using the area() method of the parent class, I am getting an error. So how to do this?
public class Shape {
double width, height;
public Shape(double w, double h)
{
this.height = h;
this.width = w;
}
public void area(Object shape){ // area method of parent class
shape.area(); // here I am getting error.
}
}
class triangle extends Shape{
triangle tri;
public triangle(double w, double h) {
super(w, h);
}
public void area()// area method of derived class
{
double area = (1/2)*width*height;
System.out.println("The area of triangle is: "+area);
}
}
class rectangle extends Shape{
rectangle rect;
public rectangle(double w, double h) {
super(w, h);
}
public void area() // area method of derived class
{
double area = width*height;
System.out.println("The area of rectangle is: "+area);
}
}
Advertisement
Answer
You want to override the method and let the subclasses implement it. You do not need to call any method from Shape.area() at all!
public abstract class Shape {
float width, height;
Shape(float width, float height) {
this.width = width;
this.height = height;
}
public abstract float area();
}
public class Rectangle extends Shape {
public Rectangle(float width, float height) {
super(width, height);
}
@Override
public float area() { return width * height; }
}
public class Triangle extends Shape {
public Triangle(float width, float height) {
super(width, height);
}
@Override
public float area() { return (width*height) / 2; }
}
With that in place, you can do:
Shape shape = new Triangle(50f, 50f); float areaOfTri = shape.area(); // dispatches to Triangle.area() shape = new Rectangle(50f, 50f); float areaOfQuad = shape.area(); // dispatches to Rectangle.area()