2016-01-23 4 views
0

У меня есть назначение, где мне нужно создать абстрактный класс, содержащий конструктор, и абстрактный метод, который будет перекрыт подклассом.вызов частной переменной с абстрактным методом переопределения

Объектом задания является определение областей различных полигонов при наличии класса RegularPolygon в качестве базового класса.

Когда я вызываю метод по расширению подкласса, он выводит ноль. Я знаю, что проблема заключается в объеме переменной. В основном я знаю, что моя переменная сторона не читается из суперкласса, потому что она закрыта. Я не знаю, как исправить это, не изменяя его от частного к публичному или защищенного. Он должен оставаться частным.

RegularPolygon

public abstract class RegularPolygon 
{ 
    private double side; 

    public RegularPolygon(double length) 
    { 
     side = length; 
    } 

    public abstract double getArea(); 
} 

площади

public class Square extends RegularPolygon 
{ 
    private double side; 

    public Square(double length) 
    { 
     super(length); 
    } 

    public double getArea() 
    { 
     return side*side; //this returns 0 
    }  
} 

ответ

1

Один из способов заключается в создании общедоступного метода getSide() для RegularPolygon для извлечения значения в side. Таким образом, вы сможете получить только значение side и не сможете его изменить.

Вот как код будет:

// Main.java 
public static void main(String[] args) { 
    Square sq = new Square(3); 
    System.out.println(sq.getArea()); // 9.0 
} 

Это будет класс RegularPolygon

public abstract class RegularPolygon 
{ 
    private double side; 

    public RegularPolygon(double length) 
    { 
     side = length; 
    } 

    public abstract double getArea(); 

    // Add this... 
    public double getSide() { 
     return side; 
    } 
} 

И ... Квадратный класс

public class Square extends RegularPolygon{ 
    public Square(double length) 
    { 
     super(length); 
    } 
    public double getArea() 
    { 
     // use 'this.getSide()' to retrieve the value in 'side' 
     return this.getSide()*this.getSide(); 
    } 
} 
0

Вы не можете получить доступ к private полей в данном классе в расширениях этого класса. Таким образом, side, к которому вы обращаетесь в своем getArea(), является side в Square, который никогда не инициализируется.

Ответ на эту проблему должен состоять в том, чтобы создать публичный getter для side, чтобы подклассы могли получить к нему доступ (хотя и не редактировали его).

public abstract class RegularPolygon { 
    private double side; 

    public RegularPolygon(double length) { 
     side = length; 
    } 

    public double getSideLength() { 
     return side; 
    } 

    public abstract double getArea(); 
} 



public class Square extends RegularPolygon { 
    public Square(double length) { 
     super(length); 
    } 

    public double getArea() { 
     return getSideLength()*getSideLength(); 
    }  
} 

Если вы специально хотите подклассы, чтобы иметь возможность получить доступ непосредственно к side поле, сделать его protected вместо private.

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