0

私は模擬試験問題で立ち往生しています。Power私は、数を任意の累乗に上げることができるというクラスを作成しました。

質問の3番目の部分では、BoundedPowerを拡張する別のクラスを作成するように求められますPowerMAX-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

4 に答える 4

3

クラスにそのインスタンスのPower変数xは必要ありません。BoundedPowerインスタンスはすべてPowerインスタンスであるため、Powerからメソッドを参照するには、super.blah()を実行します。したがって、x.getX()の場合は、super.getX()を実行します。

また、コメントの中で、this.x=xはプライベートであるため失敗するとおっしゃいました。スーパーコールを実行すると、スーパークラス(Power)のコンストラクターが呼び出され、そこにxが設定されるため、this.x=xは必要ありません。

于 2012-08-11T22:00:20.263 に答える
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

于 2012-08-11T22:05:40.690 に答える
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);
  }
}
于 2012-08-11T22:05:49.403 に答える
1

私は別の方法でそれを行います。あなたが言っていることから、BoundedPowerクラスは制限されたx(MAX_Xまで)に対してのみ意味があります。

したがって、xがMAX_Xより大きいオブジェクトの作成は許可しません(つまり、BoundedPowerオブジェクトは無制限のxには存在できません)

したがって、実装は、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);
        }
  }
于 2012-08-11T22:16:36.463 に答える