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?
JavaScript
x
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!
JavaScript
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:
JavaScript
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()