| 
 abstract 
public 
class Figur { 
    abstract 
    void besuche(FigurBesucher v); 
    //-------------------- 
    double attribut(FigurAttribut va) { 
        besuche(va); 
        return 
            va.getRes(); 
    } 
    //-------------------- 
    public 
    double umfang() { 
        return 
            attribut(new FigurAttribut() { 
                public 
                void besucheRechteck(Rechteck r) { 
                    res += 2 * (r.breite + r.hoehe); 
                } 
                public 
                void besucheKreis(Kreis k) { 
                    res += 2 * java.lang.Math.PI * k.radius; 
                } 
            }); 
    } 
    //-------------------- 
    public 
    double flaeche() { 
        return 
            attribut(new FigurAttribut() { 
                public 
                void besucheRechteck(Rechteck r) { 
                    res += r.breite * r.hoehe; 
                } 
                public 
                void besucheKreis(Kreis k) { 
                    res += java.lang.Math.PI * k.radius * k.radius; 
                } 
            }); 
    } 
    //-------------------- 
    public 
    Figur kopiere() { 
        FigurKopierer fk = new FigurKopierer(); 
        besuche(fk); 
        return 
            fk.getRes(); 
    } 
} 
 | 
    
| 
 public 
class Rechteck extends Figur { 
    double breite, hoehe; 
    public Rechteck(double breite, 
                    double hoehe) { 
        this.breite = breite; 
        this.hoehe  = hoehe; 
    } 
    void besuche(FigurBesucher v) { 
        v.besucheRechteck(this); 
    } 
} 
 | 
    
| 
 public 
class Kreis extends Figur { 
    double radius; 
    public Kreis(double radius) { 
        this.radius = radius; 
    } 
    void besuche(FigurBesucher v) { 
        v.besucheKreis(this); 
    } 
} 
 | 
    
| 
 public 
class FigurMitPosition extends Figur { 
    double x,y; 
    Figur figur; 
    public FigurMitPosition(double x, 
                            double y, 
                            Figur figur) { 
        this.x     = x; 
        this.y     = y; 
        this.figur = figur; 
    } 
    void besuche(FigurBesucher v) { 
        v.besucheFigurMitPosition(this); 
    } 
} 
 | 
    
| 
 public 
class KomplexeFigur extends Figur { 
    Figur[] teile; 
    public 
    KomplexeFigur(Figur[] teile) { 
        this.teile = teile; 
    } 
    void besuche(FigurBesucher v) { 
        v.besucheKomplexeFigur(this); 
    } 
} 
 | 
    
| 
 interface FigurBesucher { 
    void besucheRechteck(Rechteck r); 
    void besucheKreis(Kreis k); 
    void besucheFigurMitPosition(FigurMitPosition f); 
    void besucheKomplexeFigur(KomplexeFigur f); 
} 
 | 
    
| 
 public 
class FigurBesucher0 implements FigurBesucher { 
    public 
    void besucheRechteck(Rechteck r) {} 
    public 
    void besucheKreis(Kreis k) {} 
    public 
    void besucheFigurMitPosition(FigurMitPosition f) { 
        f.figur.besuche(this); 
    } 
    public 
    void besucheKomplexeFigur(KomplexeFigur f) { 
        for ( int i = 0; 
              i < f.teile.length; 
              ++i ) { 
            f.teile[i].besuche(this); 
        } 
    } 
} 
 | 
    
| 
 public 
class FigurAttribut extends FigurBesucher0 { 
    protected 
    double res = 0; 
    public 
    double getRes() { 
        return 
            res; 
    } 
} 
 | 
    
| 
 public 
class FigurKopierer implements FigurBesucher { 
    private 
    Figur res; 
    public 
    Figur getRes() { 
        return 
            res; 
    } 
    //-------------------- 
    public 
    void besucheRechteck(Rechteck r) { 
        res = new Rechteck(r.hoehe, r.breite); 
    } 
    public 
    void besucheKreis(Kreis k) { 
        res = new Kreis(k.radius); 
    } 
    public 
    void besucheFigurMitPosition(FigurMitPosition f) { 
        f.figur.besuche(this); 
        res = new FigurMitPosition(f.x,f.y,res); 
    } 
    public 
    void besucheKomplexeFigur(KomplexeFigur f) { 
        Figur[] teile = new Figur[f.teile.length]; 
        for ( int i = 0; 
              i < f.teile.length; 
              ++i ) { 
            f.teile[i].besuche(this); 
            teile[i] = res; 
        } 
        res = new KomplexeFigur(teile); 
    } 
} 
 | 
    
| 
    1module Figur where 
   2 
   3data Figur = Rechteck { breite :: Double 
   4                      , hoehe  :: Double 
   5                      } 
   6           | Kreis    { radius :: Double 
   7                      } 
   8           | MitPos   { x :: Double 
   9                      , y :: Double 
  10                      , f :: Figur 
  11                      } 
  12           | Komplex  { teile :: [Figur] } 
  13 
  14-- ---------------------------------------- 
  15 
  16visit :: (Double -> Double        -> res) -> 
  17         (Double                  -> res) -> 
  18         (Double -> Double -> res -> res) -> 
  19         ([res]                   -> res) -> 
  20         Figur -> res 
  21 
  22visit pRechteck pKreis pMitPos pKomplex = go 
  23  where 
  24    go (Rechteck b h) = pRechteck b h 
  25    go (Kreis    r  ) = pKreis    r 
  26    go (MitPos x y f) = pMitPos   x y (go f) 
  27    go (Komplex   fs) = pKomplex (map go fs) 
  28 
  29-- ---------------------------------------- 
  30     
  31umfang :: Figur -> Double 
  32umfang = visit 
  33         (\ b h -> 2 * b * h) 
  34         (\ r -> 2 * pi * r) 
  35         (\ x y u -> u) 
  36         sum 
  37 
  38flaeche :: Figur -> Double 
  39flaeche = visit 
  40          (\ b h -> b * h) 
  41          (\ r -> pi * r^2) 
  42          (\ x y f -> f) 
  43          sum 
  44 
  45-- die id-Funktion 
  46klonen :: Figur -> Figur 
  47klonen = visit Rechteck Kreis MitPos Komplex 
 | 
    
| Letzte Änderung: 03.01.2017 | © Prof. Dr. Uwe Schmidt |