该子类如何与主类交互

时间:2012-08-11 21:56:53

标签: java

我被困在模拟考试问题上。我创建了一个名为Power的类,它允许将一个数字提升到任何幂。

问题的第三部分要求我创建另一个类BoundedPower,它将扩展Power。我被赋予了MAX-X变量(x不能超过这个值),并告诉BoundedPower类必须:表现得像Power类,使用构造函数并使用powN方法

我的代码如下,我不知道如何使BoundedPower班级工作。

public class Power {

    private double x = 0;

    Power(double x) {
        this.x = x;
    }

    public double getX() {
        return x;
    }

    public double powN(int n) {

        double result = 1.0;
        for (int i = 0; i < n; i++) {
            result = result * x;
        }
        return result;

    }

    public static void main(String[] args) {

        Power p = new Power(5.0);
        double d = p.powN(3);
        System.out.println(d);
    }

}


public class BoundedPower extends Power {

    public static final double MAX_X = 1000000;

    // invariant: x <= MAX_X

    Power x;

    BoundedPower(double x) {
        super(x);
        // this.x=x; x is private in Power class

    }

    public double powN(int n) {

        if (x.getX() > MAX_X) {

            return 0;
        } else {

            double result = 1.0;
            for (int i = 0; i < n; i++) {
                result = result * getX();
            }
            return result;
        }
    }

    public static void main(String[] args) {

        BoundedPower bp = new BoundedPower(5);
        double test = bp.powN(4);
        System.out.println(test);
    }

}

4 个答案:

答案 0 :(得分:3)

您的班级中不需要该实例Power变量x。任何BoundedPower实例都是一个Power实例,因此,要从Power引用一个方法,请执行super.blah(),所以对于x.getX(),执行super.getX()

此外,在你的评论中,你说this.x = x失败,因为它是私有的。当你进行超级调用时,它调用超类(Power)的构造函数,它在那里设置x,所以不需要this.x = x

答案 1 :(得分:1)

public class BoundedPower extends Power {

  public static final double MAX_X = 1000000;

  BoundedPower(double x) {
    super(x);
  }

   public double powN(int n) {

     if (x.getX() > MAX_X) {
      return 0;
     } else {
      return super.powN(n);
     }
   }

   public static void main(String[] args) {

   BoundedPower bp = new BoundedPower(5);
   double test = bp.powN(4);
   System.out.println(test);
 }
} 

您不必将计算公式复制到子类(只需调用super.powN(..))。您在Power中也不需要BoundedPower的其他实例。

答案 2 :(得分:1)

这可能是他们想到的:

public class Power {
 public double powN(double x, int n) {
    double result = 1.0;
    for (int i = 0; i < n; i++) {
        result = result * x;
    }
    return result;
  }
}

public class BoundedPower extends Power {
  private final double maxX;

  public BoundedPower(double maxX) {
    this.maxX = maxX;
  }

  public double powN(double x, int n) {
    if (x > maxX) {
      throw new IllegalArgumentException("x value [" + x + "] " + 
        "greater than expected max [" + maxX + "]");
    }
    return super.powN(x, n);
  }
}

答案 3 :(得分:1)

我会以不同的方式做到这一点。根据你的说法,BoundedPower类只对有界x(最多MAX_X)有意义。

因此,我不允许创建x大于MAX_X的对象(即无界x的BoundedPower对象不存在)

因此除了构建BoundedPower实例的方式之外,实现将与Power实现完全相同:首先检查构建它是否有意义

  public class BoundedPower extends Power {

        private static final double MAX_X = 1000000; //makes no sense to be public

        public static BoundedPower newBoundedPower(int n)
                                   throws IllegalNumberException{

               if(x > MAX_X) throw new IllegalNumberException();
               return new BoundedPower(x);
        }

        private BoundedPower(double x) {
               super(x);
        }
  }