2016-01-23 84 views
0

我有一个任务,我需要创建一个抽象类,其中包含constructer和一个抽象方法,将被子类覆盖。调用私有变量与抽象方法覆盖

赋值的对象是确定不同多边形的区域,同时使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; 
    } 
} 

而且...... Square类

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场在给定的类在该类的扩展。因此,您在getArea()中访问的sideside中的Square,它从不初始化。

对此的最佳实践答案是为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