0

だから私は単純な計算をしようとしていますが、いくつかの問題があります エラーメッセージ:この行に複数のマーカーがあります - アプリケーションタイプの囲みインスタンスにアクセスできません。タイプ Application の囲んでいるインスタンスで割り当てを修飾する必要があります (例: x は Application のインスタンスである xnew A())。- 行ブレークポイント:Application [行: 64] - main(String[])

私は何を間違っていますか?誰かが何か間違ったことを見て、それを修正できますか?

public class Application {
interface MathOp {
    public double doMath(double a, double b);
    }

    class Add implements MathOp{

      public double doMath(double a, double b) {
        return (a + b);
      }

    }

    class Sub implements MathOp{

      public double doMath(double a, double b) {
        return (a - b);
      }

    }
    class Div implements MathOp{

        public double doMath(double a, double b){
            return (a / b);
        }
    }
    class Mul implements MathOp{

        public double doMath(double a, double b){
            return (a * b);
        }
    }

public static void main(String[] args) {



            Scanner sc = new Scanner(System.in);
            double a,b,c;
            int choice = 0;
            a=b=c=0.0;
            while(true) {
              System.out.println("Enter two numbers");
              a = Double.parseDouble(sc.nextLine());
              b = Double.parseDouble(sc.nextLine());

              System.out.println("Enter your choice");
              System.out.println("1. Add");
              System.out.println("2. Sub");
              System.out.println("3. Mul");
              System.out.println("4. Div");

              choice = Integer.parseInt(sc.nextLine());

              switch(choice) {
               case 1 :
                      c = new Add().doMath(a,b);
                      break;
               case 2 :
                      c = new Sub().doMath(a,b);
                      break;
               case 3 :
                      c = new Div().doMath(a,b);
                      break;
               case 4 :
                      c = new Mul().doMath(a,b);
                      break;
               default:
                       break;

               }
              System.out.println(c + "this is the answere");


              System.out.println("would you like to continue? (Y/N)");
              if("N".equalsIgnoreCase(sc.nextLine())) { // careful with the paranthesis 
                break;
              }
            }

}

4

1 に答える 1

2

問題はAddSubなどのクラスが内部クラスであることです。つまり、含まれているクラスのインスタンスが必要です...この時点では必要ありません。

オプション:

  • enum(ベスト!)操作ごとに 1 つのメンバーを持つ (最上位で、ネストされていない) を作成する代わりに、インターフェイスを取り除きます。列挙型は、各メンバーでオーバーライドされる抽象メソッドを宣言します。

    public enum MathOperation {
        ADDITION { 
            @Override public double doMath(double a, double b) {
                return a + b;
            }
        },
        SUBTRACTION { 
            @Override public double doMath(double a, double b) {
                return a - b;
            }
        }
        // etc
        ;
    
        public abstract double doMath(double a, double b);
    }
    
  • (わかりました) インターフェイスと実装クラスは保持しますが、Applicationクラスの外に移動します。入れ子になった型は、IMO ではかなり珍しいはずです。
  • (良くない)static修飾子を各実装クラスに追加します。それらはネストされたままになりますが、 のインスタンスへの暗黙的な参照は必要ありませんApplication
  • (うーん!) のインスタンスをApplication作成して、操作クラスのインスタンスを作成できるようにします。これをしないでください。完全を期すためにのみ含めています。

ネストされたクラスは確かに便利ですが、Java に比較的慣れていない場合は、現時点では使用しないことをお勧めします。それらには独自のルールと構文が付属しており、最初は少し奇妙かもしれません。代わりに、トップレベルですべてのタイプを宣言してください。

于 2013-09-28T07:12:09.220 に答える