Questo è un buon esempio di ricorsione aperta?

2

Capisco aprire la ricorsione come il processo di un metodo su una classe che chiama un altro metodo su una classe usando una parola chiave come this , ma in cui la chiamata al metodo può effettivamente essere associata a un sotto classe in fase di esecuzione.

Questa è una giusta dimostrazione di ricorsione aperta?

class Sup {
    go() {
        alert('sup');
    }

    callGo() {
        this.go();
    }
}

class Sub extends Sup {
    go() {
        alert('sub');
    }
}

var sub = new Sub();
sub.callGo();
    
posta Fenton 13.02.2014 - 22:04
fonte

2 risposte

1

Sì, questo è un buon esempio di ricorsione aperta.

Open recursion. Another handy feature offered by most languages with objects and classes is the ability for one method body to invoke another method of the same object via a special variable called self or, in some langauges, this. The special behavior of self is that it is late-bound, allowing a method defined in one class to invoke another method that is defined later, in some subclass of the first.

-- Types and Programming Languages, Benjamin C. Pierce, 2002, MIT Press, pg 227.

Nell'esempio, il metodo Sup.callGo chiama il metodo go definito nella sottoclasse. Questa è una ricorsione aperta secondo la definizione di Pierce. I metodi non hanno bisogno di avere lo stesso nome.

    
risposta data 03.10.2018 - 14:44
fonte
5

No, in questo caso Sub semplicemente sovrascrive Sup.go() e quindi viene eseguito solo Sub.go() .

La ricorsione aperta è quando un metodo in una classe può chiamare se stesso (cioè la propria firma) che è ricorsione, ma a causa dell'invio dinamico (can) in realtà chiama una sottoclasse, che è una ricorsione aperta:

class A {
    protected int counter = 1;
    public void loop() {
        System.out.println("Looping " + counter + " times");
        counter++;
        this.loop();
    }
}

class B extends A {
    @Override
    public void loop() {
        if(counter == 1) {
             super.loop();
        }
    }
}

Ora new A().loop() eseguirà un loop indefinitamente * , ma new B().loop() verrà terminato.

* In realtà causerà un overflow dello stack a meno che tu non abbia uno stack inifinito o un'ottimizzazione di chiamata di coda

    
risposta data 13.02.2014 - 23:53
fonte

Leggi altre domande sui tag