-1

関数名をパラメーターに追加するだけで別の関数を呼び出すことができるかどうか疑問に思っていました。たとえば、4 つの部分からなるスクリプトを作成したいとします。各部分には入力が必要です (私はスキャナーを使用しています。理由は聞かないでください:P 割り当てです)。次に、計算などのために別のスクリプトに渡す必要があります。

私はこれから始めます:

static int intKiezer(String returnFunctie, String text) {

    Scanner vrager = new Scanner(System.in);
    while (true) {

        System.out.println(text);
        int intGekozen = vrager.nextInt();

        if (vrager.hasNextInt()) {

            returnFunctie(intGekozen);
        }

        else {

            vrager.next();
            System.out.println("Verkeerde invoer!");
        }
    }

ご覧のとおり、取得した値を別の関数にプッシュしようとしています (returnFunctie(intgekozen))。intgekozen をパラメーターとして returnFunctie を呼び出す必要があります。しかし、それは機能していません

私は次のように関数を呼び出します: intKiezer(sphereCalculations, "What radius do you want to have?"). したがって、入力からの答えは、その正しいものが sphereCalculations と呼ばれる別の関数に渡される必要がある場合

4

2 に答える 2

3

ここにアイデアがあります。

実行したい計算を行うメソッドを持つインターフェイスを定義します。例えば:

interface Algorithm {
    int execute(int value);
}

次に、インターフェイスを実装する 1 つ以上のクラスを定義し、必要な計算を実行します。例えば:

class MultiplyByTwo implements Algorithm {
    public int execute(int value) {
        return value * 2;
    }
}

class AddThree implements Algorithm {
    public int execute(int value) {
        return value + 3;
    }
}

次に、パラメータとして を受け入れるようにメソッドを記述Algorithmします。目的の値でアルゴリズムを実行します。

static int intKiezer(Algorithm algo, String text) {
    // ...

    return algo.execute(intGekozen);
}

interface の実装クラスの 1 つのインスタンスを渡して、メソッドを呼び出しますAlgorithm

int result = intKiezer(new MultiplyByTwo(), "Some question");
System.out.println("Result: " + result);
于 2012-11-06T15:59:06.723 に答える
1

@Jesperが言ったように、それはリフレクションで可能であり、おそらくリフレクションでのみ可能です。リフレクションは、オブジェクトがそれ自体を分析し、そのメンバー (属性とメソッド) を反復処理できるプロセスです。あなたの場合、方法を探しているようです。

コードを見ると、実際には、パラメータを適用できる関数オブジェクトをコードに渡す必要があるように見えます。これは Java では不可能です。クロージャーを追加することで、Java 8 でも同様のことが可能になります。Closure をパラメーターとして渡すか、クロージャーまたは関数をサポートする他の言語を渡すことで、Groovy でそれを行うことができます。

次のように、抽象クラス/インターフェイスを定義し、そのインスタンスをメソッドに渡し、パラメーターを渡すメソッドを呼び出すことで、目的に近づくことができます。

interface Function <T> {
  public Integer call(T t);
}


public class TestFunction {
    static int intKiezer(Function<Integer> returnFunctie, String text) 
    {
        int a = 10;
        System.out.println(text);

        return returnFunctie.call(a);
    }

    public static void main(String[] args)
    {
        Function<Integer> function = new Function<Integer>() {
          public Integer call(Integer t) { return t * 2; }
        };

        System.out.println( intKiezer(function, "Applying 10 on function") );
    }
}

メソッドを呼び出すことが目的の場合は、リフレクション ライブラリを使用することをお勧めします。Apache Common の MethodUtilが思い浮かびます。私はこれがあなたの男だと思います:

invokeMethod(Object object, String methodName, Object arg)
    Invoke a named method whose parameter type matches the object type.
于 2012-11-06T16:24:41.083 に答える