Quote Originariamente inviata da felpone Visualizza il messaggio
Salve a tutti, penso proprio che questo problema che ho sia sui fondamentali della programmazione ad oggetti. In questo esercizio non riesco proprio a capire il funzionamento del metodo getLength .



codice:
class Point {


    private int x;
    private int y;


    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }


    public static void main(String argv[]) {


        Point p1 = new Point(0, 0);
        Walk w1 = new Right(new Down(new Left(new Up(new Stop()))));
        Walk w2 = new Left(new Left(new Up(new Stop())));
        // Walk w3=new Right(new Stop());
        System.out.println(w2.getLength());
    }
}


abstract class Walk {


    public abstract boolean isStop();


    public abstract int getLength();
}


class Stop extends Walk {


    @Override
    public boolean isStop() {
        return true;
    }


    @Override
    public int getLength() {
        return 0;
    }
}


abstract class Move extends Walk {


    Walk tail;
    


    @Override
    public int getLength() {
      
       return 1+tail.getLength();
    }


    Move(Walk tail) {
        this.tail = tail;
        System.out.println(tail);
    }


    @Override
    public boolean isStop() {
        return true;
    }
}


class Right extends Move {


    public Right(Walk tail) {


        super(tail);


    }
}


class Left extends Move {


    public Left(Walk tail) {
        super(tail);
    }
}


class Up extends Move {


    public Up(Walk tail) {
        super(tail);
    }
}


class Down extends Move {


    public Down(Walk tail) {
        super(tail);
    }
}

Ciao, se è un esempio che ti hanno fatto ad una lezione di un corso di base...bhe è la peggiore cosa che abbia mai visto!
Ad ogni modo, poiché tutti quegli oggetti dai nomi confusionari sono collegati da ereditarierà ed incapsulamento il tuo metodo sulla lunghezza, facendo 1+tail.getLenght() restituirà il numero di "passi" (o come li vuoi chiamare) di cui è composto il "walk"

Per capirlo meglio devi riflettere sul fatto che l'oggetto tail contenuto nell'oggetto Move è istanza di Walk, e che Move è a sua volta discendente di Walk. Quindi facendo 1+tail.getLenght() la seconda parte di questa chiamata (cioè quella dopo il '+') fa partire tutta una serie di chiamate innestate al metodo getLength() su oggetti tail diversi, fin quando non incontra un tail che è in realtà uno Stop. Qui ritornerà zero, senza fare altre chiamate ricorsive, e srotolando tutte le chiamate ti troverai con una somma tipo 1+1+1+...+1

Dubito di essere stato chiaro, ma spero t'aiuti.

Ciao