Jammy Dodger
Jammy Dodger

Reputation: 31

Encapsulation with Java

I'm trying to implement encapsulation in a program as part of some coursework however I've run into an error which I just can't seem to be able to fix with my limited knowledge which isn't helped by my Teacher/Lecturer who is very good at what he does however doesn't do very well when it actually comes to communicating the information, because of this could someone help me fix the error which is presented from the following program and explain to me why it's not working as intended.

class TwoDShapeEncap{
    double width, height;

    //Width
    void setWidth(double w){
        width = w;
    }

    double getWidth(){
        return width;
    }
    //Height
    void setHeight(double h){
        height = h;
    }

    double getHeight(){
        return height;
    }
}

class Triangle extends TwoDShapeEncap{
    String type;
    private double sideA, sideB, sideC, adjacent, opposite;

    //Side A
    void setsideA(double a){
        sideA = a;
    }
    double getsideA(){
        return sideA;
    }
    //Side B
    void setsideB(double b){
        sideB = b;
    }
    double getsideB(){
        return sideB;
    }
    //Side C
    void setsideC(double c){
        sideC = c;
    }
    double getsideC(){
        return sideC;
    }
    //Adjacent
    void setadjacent(double a){
        adjacent = a;
    }
    double getadjacent(){
        return adjacent;
    }
    //Opposite
    void setopposite(double o){
        width = o;
    }
    double getopposite(){
        return opposite;
    }

    double getPerimeter(){
        if(getsideB() == 0.0 && getsideC() == 0.0){
            type = "equilateral";
            return getsideA() * 3;
        }
        else if (getsideC() == 0.0){
            type  = "isosceles";
            return getsideA() + getsideB() * 2;
        }
        else{
            type = "scalene";
            return getsideA() + getsideB() + getsideC();
        }
    }


    //*******************************************************************************************
    //* Paste the perimeter() and hypotenuse() methods from your previous class into this class *
    //*******************************************************************************************

    //***************************************
    //* add an area method()into this class *
    //***************************************

    double area(double a, double b){
        getWidth();
        getHeight();
        return (getWidth() * getHeight()/2);
    }
}

class Rectangle extends TwoDShapeEncap{
    boolean issquare;

    private double height, width;

    //Height
    void setHeight(double h){
        height = h;
    }
    double getHeight(){
        return height;
    }
    //Width
    void setWidth(double w){
        width = w;
    }
    double getWidth(){
        return width;
    }

    double perimeter(double h, double w){
        getHeight();
        getWidth();
        return getHeight() * 2 + getWidth() * 2;
    }

    double area(double a, double b){
        //getWidth();
        //getHeight();
        return (getWidth() * getHeight()/2);
    }

    boolean testSquare(double h, double w){
        //getHeight();
        //getWidth();
        if (getHeight() == getWidth())
            issquare = true;
        else issquare = false;
        return issquare;
    }

    //*********************************************
    //* add area and perimeter methods this class *
    //*********************************************

    //*************************************************************************
    //* add a testSquare method to test if a particular rectangle is a square *
    //*************************************************************************

}

//Add a circle class which includes area and circumference methods

class Circle extends TwoDShapeEncap{
    double radius, diameter;

    double area (double r){
        radius = r;
        return Math.PI * (radius * radius);
    }

    double perimeter (double r){
        radius = r;
        return 2 * (Math.PI * radius);
    }
}

class TwoDShapeEncapDemoNew {
    public static void main(String args[]) {
    //Triangle
    Triangle t = new Triangle();
    t.setsideA(5.7);
        System.out.println("The perimeter is " + t.getPerimeter());
        System.out.println("If sideA is " + t.getsideA() );
        System.out.println("The type is " + t.type);
        System.out.println();
    t.setsideB(7.3);
        System.out.println("The perimeter is " + t.getPerimeter());
        System.out.println("If sideA is " + t.getsideA() );
        System.out.println("If sideB is " + t.getsideB() );
        System.out.println("The type is " + t.type);
        System.out.println();
    t.setsideC(2.7);
        System.out.println("The perimeter is " + t.getPerimeter());
        System.out.println("If sideA is " + t.getsideA());
        System.out.println("If sideB is " + t.getsideB());
        System.out.println("If sideC is " + t.getsideC());
        System.out.println("The type is " + t.type);
        System.out.println();
        //Rectangle
        Rectangle r = new Rectangle();
    r.setHeight(7.8);
    r.setWidth(4.2);
        System.out.println("The perimeter is " + r.perimeter());
        System.out.println("The");

    }
}

Error message:

Main.java:186: error: method perimeter in class Rectangle cannot be applied to given types; System.out.println("The perimeter is " + r.perimeter()); ^ required: double,double found: no arguments reason: actual and formal argument lists differ in length 1 error –

Upvotes: 1

Views: 673

Answers (5)

ParkerHalo
ParkerHalo

Reputation: 4430

Since everybody is just facing the problem with the parameters I will face this problem: Getters are used to get the values of private fields if you're "outside" your class! If you're in a method in your class you don't have to use the getters, you can just use the variables themselfs:

Example:

public class SomeClass {
    private int a;

    public void setA(int anotherA) {
        a = anotherA;
    }
    public int getA() {
        return a;
    }

    public int getSquareOfA() {
        // You don't use getA() to get the value now 
        // but you use a itself!
        return a*a;    // instead of 'return getA() * getA();'
    }
}

You do have that problem at several points in your code!

According to your problem:

Your problem was that you're calling a method which has 2 parameters without any input parameters!

You can either remove the parameters of the method (which will be the logically right thing to do in your case), OR you pass some parameters.

In your specific case that means, change your perimiter() method as follows:

double perimiter() {
    return (height + width) * 2;
    // or if you want to impress your teacher ;) :
    // return (height + width) << 1
}

Also you should change that methodname to getPerimiter() to keep up with your own naming conventions!

Upvotes: 1

bruno_cw
bruno_cw

Reputation: 1031

Thats because you are defining the perimeter function like this:

double perimeter(double h, double w){
    getHeight();
    getWidth();
    return getHeight() * 2 + getWidth() * 2;
}

and calling System.out.println("The perimeter is " + r.perimeter()); with no parameters.

Since you are not really using double h and double w for nothing, you just have to remove them from the method definition

double perimeter(){
    return getHeight() * 2 + getWidth() * 2;
}

Upvotes: 1

under_the_sea_salad
under_the_sea_salad

Reputation: 1804

Modify your signature to remove the arguments.

class Rectangle extends TwoDShapeEncap{
    ///...

    double perimeter(double h, double w){
        getHeight();
        getWidth();
        return getHeight() * 2 + getWidth() * 2;
    }

should be

class Rectangle extends TwoDShapeEncap{
    ///...

    double perimeter(){
        //Notice that you don't need to pass in these arguments 
        //as this function gets these arguments by itself. 
        return getHeight() * 2 + getWidth() * 2;
    }

Upvotes: -1

Piyin
Piyin

Reputation: 1834

The method perimeter in the class Rectangle expects two parameters, and you're not passing any. You could either call it like this:

r.perimeter(7.8,4.2);

Or redefine the method so it looks like this:

double perimeter(){
    return getHeight() * 2 + getWidth() * 2;
}

Upvotes: 1

Joe Taras
Joe Taras

Reputation: 15379

When you call:

System.out.println("The perimeter is " + r.perimeter());

in r.perimeter you must pass two parameters (as your signature wants)

Your method in Rectangle class:

double perimeter(double h, double w){
    getHeight();
    getWidth();
    return getHeight() * 2 + getWidth() * 2;
}

So fix:

System.out.println("The perimeter is " + r.perimeter(r.getHeight(), r.getWidth()));

You also can fix your method perimeter without parameters because in the body you use getHeigth() and getWidth() properties

So you can write:

double perimeter(){
    return getHeight() * 2 + getWidth() * 2;
}

Upvotes: 5

Related Questions