使用抽象方法覆盖调用私有变量
calling private variable with abstract method overriding
我有一个作业需要创建一个包含构造函数的抽象 class 和一个将被子 class 覆盖的抽象方法。
作业的目的是确定不同多边形的面积,同时以 RegularPolygon class 为底 class。
当我通过 subclass 扩展调用该方法时,它打印出零。我知道问题是变量的范围。基本上我知道我的变量端没有从 super class 中读取,因为它是私有的。如果不将其从私有更改为 public 或受保护,我不知道如何解决该问题。它需要保密。
正多边形
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
}
}
您无法在 class 的扩展中访问给定 class 中的 private
字段。因此,您在 getArea()
中访问的 side
是 Square
中的 side
,它从未被初始化。
对此的最佳做法是为 side
创建一个 public getter,以便 subclasses 可以访问它(尽管不能编辑它)。
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();
}
}
如果您特别希望 subclasses 能够直接访问 side
字段,请将其设为 protected
而不是 private
.
一种方法是为 RegularPolygon
创建一个 public getSide()
方法来检索 side
中的值。这样您将只能检索 side
中的值并且仍然无法更改它。
代码如下:
// Main.java
public static void main(String[] args) {
Square sq = new Square(3);
System.out.println(sq.getArea()); // 9.0
}
这将是 RegularPolygon class
public abstract class RegularPolygon
{
private double side;
public RegularPolygon(double length)
{
side = length;
}
public abstract double getArea();
// Add this...
public double getSide() {
return side;
}
}
还有...广场 class
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();
}
}
我有一个作业需要创建一个包含构造函数的抽象 class 和一个将被子 class 覆盖的抽象方法。
作业的目的是确定不同多边形的面积,同时以 RegularPolygon class 为底 class。
当我通过 subclass 扩展调用该方法时,它打印出零。我知道问题是变量的范围。基本上我知道我的变量端没有从 super class 中读取,因为它是私有的。如果不将其从私有更改为 public 或受保护,我不知道如何解决该问题。它需要保密。
正多边形
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
}
}
您无法在 class 的扩展中访问给定 class 中的 private
字段。因此,您在 getArea()
中访问的 side
是 Square
中的 side
,它从未被初始化。
对此的最佳做法是为 side
创建一个 public getter,以便 subclasses 可以访问它(尽管不能编辑它)。
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();
}
}
如果您特别希望 subclasses 能够直接访问 side
字段,请将其设为 protected
而不是 private
.
一种方法是为 RegularPolygon
创建一个 public getSide()
方法来检索 side
中的值。这样您将只能检索 side
中的值并且仍然无法更改它。
代码如下:
// Main.java
public static void main(String[] args) {
Square sq = new Square(3);
System.out.println(sq.getArea()); // 9.0
}
这将是 RegularPolygon class
public abstract class RegularPolygon
{
private double side;
public RegularPolygon(double length)
{
side = length;
}
public abstract double getArea();
// Add this...
public double getSide() {
return side;
}
}
还有...广场 class
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();
}
}