Generischer Besucher

Eigentlich soll ja auch das gehen,

Operation.contains (new Zahlenfolge(1,5,2,8), 2)) ==> true
geht aber nicht, weil der Rückgabewert bisher auf int fixiert ist.

Lösung der Rückgabetyp wird ein Parameter:

class Zahlenfolge { ...
  public interface Visitor<R> {
    R empty();
    R nonempty(R previous_result, int element);
  }
}
Behandlung eines Besuchers
class Zahlenfolge { ...
  public <R> R visit(Visitor<R> v) {
    R accu = v.empty();
    for (int x : this.contents) {
      accu = v.nonempty(accu, x);
    }
    return accu;
  }
}
Beispiel:
public class Operation {
  static boolean contains (Zahlenfolge f, int x) {
    return f.visit(new Zahlenfolge.Visitor<Boolean>() {
      public Boolean empty() { return false; }
      ...
  }
}



Johannes Waldmann 2007-06-13