deferred class GeneratorInterface feature BerechneSinus(zahl: double): double is deferred end end -- class GeneratorInterface class SinusGenerator inherit GeneratorInterface creation init feature zaehler: integer; -- Anzahl Schleifen feature -- Creation init is do print("SinusGenerator.init %N"); end feature -- liefert Anzahl Schleifen getZaehler(): integer is do result:= zaehler; end feature -- Hilfsfunktion BerechneFakultaet(int: integer): double is -- double, weil Fakultaet so schnell steigt do if int=1 then result:= 1; else result:= int*BerechneFakultaet((int-1)); end end BerechneSinus(zahl: double): double is -- Berechnung durch Reihenentwicklung -- sin(x)= (x^1/1!)-(x^3/3!)+(x^5/5!)-(x^7/7!)+ ... local max_fehler: double; term, term2, ergebnis: double; i: integer; do print("SinusGenerator.BerechneSinus(");print(zahl);print(") %N"); max_fehler:= 0.0000001; zaehler:=0; term:= zahl; ergebnis:= 0; from i:=1 until term < max_fehler loop term:= zahl^i/BerechneFakultaet(i); term2:= term - (zahl^(i+2)/BerechneFakultaet(i+2)); ergebnis:= ergebnis + term2; i:=i+4; zaehler:= zaehler + 1; end result:= ergebnis; end end -- class SinusGenerator class GeneratorProxy inherit GeneratorInterface creation init feature genobj: SinusGenerator; zugriff, speicher: double; feature -- Creation init is do print("GeneratorProxy.init %N"); !!genobj.init; end feature BerechneSinus(zahl: double): double is do print("GeneratorProxy.BerechneSinus(");print(zahl); print(")%N"); if zugriff/=zahl then speicher:= genobj.BerechneSinus(zahl); zugriff:= zahl; print("Die Berechnung hat ");print(genobj.getzaehler());print(" Schleifen gekostet! %N"); print("Sinus von ");print(zahl); print(" jetzt im Cache abgelegt! %N"); end result :=speicher; end end -- class GeneratorProxy class Client creation init feature -- Creation init (args : ARRAY [STRING]) is local d: double; anfrage: GeneratorProxy; do !!anfrage.init; d:= anfrage.BerechneSinus(3.01); print("Client: ");print(d);print("%N---------------------------------------------------%N"); d:= anfrage.BerechneSinus(3.01); print("Client: ");print(d);print("%N---------------------------------------------------%N"); d:= anfrage.BerechneSinus(4.2); print("Client: ");print(d);print("%N---------------------------------------------------%N"); d:= anfrage.BerechneSinus(3.01); print("Client: ");print(d);print("%N---------------------------------------------------%N"); d:= anfrage.BerechneSinus(4.2); print("Client: ");print(d);print("%N---------------------------------------------------%N"); d:= anfrage.BerechneSinus(4.2); print("Client: ");print(d);print("%N---------------------------------------------------%N"); end end -- class Client