2015-11-18 2 views
1

Я пытаюсь реализовать инкапсуляцию в программе как часть некоторой курсовой работы, однако я столкнулся с ошибкой, которую я просто не могу исправить с помощью моих ограниченных знаний, которые не помогают мой учитель/преподаватель, который очень хорошо разбирается в том, что он делает, но не очень хорошо, когда он действительно приходит к общению с информацией, потому что это может помочь мне исправить ошибку, которая представлена ​​из следующей программы и объяснить мне почему он не работает должным образом.Инкапсуляция с Java

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

    } 
} 

Сообщение об ошибке:

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 –

+0

Почти забыл упомянуть об ошибке: Main.java:186: ошибка: метод периметра в классе Rectangle не может применяться к заданным типам; \t \t System.out.println («По периметру» + r.perimeter()); \t \t^ требуется: двойной, двойной не найдено: нет аргументов причин: фактические и формальные списки аргументов различаются по длине 1 ошибка –

+0

Уважаемый, вывесить ошибку –

+1

ответ Джо является правильным, но ваша IDE, безусловно, должны поднять это, нет? –

ответ

5

Когда вы звоните:

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

в r.perimeter вы должны передать два параметра (как ваша подпись хочет)

Ваш метод Класс прямоугольника:

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

Так исправить:

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

Вы можете также установить свой метод периметр без параметров, так как в организме вы используете getHeigth() и GetWidth() свойства

Таким образом, вы можете написать:

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

Я бы изменил строку в методе perimiter, чтобы 'return height * 2 + width * 2;' Не нужно вызывать методы – ParkerHalo

+0

, вы можете использовать высоту и ширину или, как я писал, getHeight() и getWidth(). Важной является подпись подписи вашего метода, чтобы предотвратить отправленную вами ошибку. –

+0

@JoeTaras. Почему вы смогли отредактировать после ответа, не имея и «отредактировав» отметку? В вашем ответе была только часть «So fix:», когда я ответил – Piyin

1

Метод perimeter в классе Rectangle ожидает два параметра, и вы не проходите мимо. Вы можете либо назвать это так:

r.perimeter(7.8,4.2); 

Или переопределить метод так, это выглядит следующим образом:

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

Это потому, что вы задающие perimeter функцию:

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

и вызов System.out.println("The perimeter is " + r.perimeter()); без параметров.

Так как вы на самом деле не используя double h и double w даром, вы просто должны удалить их из определения метода

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

, нет необходимости в первых двух строках в методе perimiter, и нет необходимости вообще не использовать поля класса! – ParkerHalo

+0

хорошо, если у вас есть класс прямоугольника, и вы определили свою ширину и высоту с помощью 'setWidth()' и 'setHeight()' почему нет необходимости? –

+0

как для getWidth() и getHeight() Я удалил их –

-1

Изменить свою подпись, чтобы удалить аргументы.

class Rectangle extends TwoDShapeEncap{ 
    ///... 

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

должен быть

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

Поскольку все просто сталкивается с проблемой с параметрами я столкнется с этой проблемой: Геттеры используются для получения значений частных полей, если вы «за пределами» ТВОЙ класс!Если вы находитесь в методе в вашем классе вы не должны использовать методы получения, вы можете просто использовать переменные themselfs:

Пример:

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

У вас есть эта проблема в несколько очков в вашем коде!

По вашей проблеме:

Ваша проблема в том, что вы вызываете метод, который имеет 2 параметра без каких-либо входных параметров!

Вы можете либо удалить параметры метода (который будет логически правильным в вашем случае), ИЛИ вы передадите некоторые параметры.

В вашем конкретном случае это означает, изменить метод perimiter() следующим образом:

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

Кроме того, вы должны изменить этот имяМетод к getPerimiter(), чтобы не отставать от своих собственных соглашений об именах!

Смежные вопросы