Definicja klasy

Klasa jest zbiorem zmiennych i funkcji opisujących właściwości i zachowanie żółwia-obiektu w POOL. Jest to wygodny sposób uporządkowania programu, w którym będzie istniało wiele żółwi.

W POOL do zdefiniowania klasy używana jest definicja funkcji. Treść funkcji-klasy powinna zawierać instrukcje wykonywane podczas tworzenia nowego żółwia - włączając w to deklaracje zmiennych i definicje funkcji składowych. Funkcja ta jest konstruktorem nowego żółwia. Uwaga: funkcja ta nie może zwracać wyniku.

W większości zadań programistycznych potrzebna jest możliwość komunikacji między żółwiami-obiektami: wzajemne odczytywanie zmiennych lub wywoływanie funkcji składowych. W POOL służy do tego operator @.
W POOL wszystkie funkcje zdefiniowane w klasie są publiczne - mogą być wywoływane przez inne żółwie. Zmienne natomiast dzielą się na trzy kategorie:
- publiczne, zdefiniowane jako globalne, mogą być odczytane przez inne żółwie przy pomocy @;
- chronione, zdefiniowane jako lokalne, niedostępne poprzez @, ale widoczne w klasach potomnych;
- statyczne, zdefiniowane jako współdzielone - jedna zmienna jest dostępna dla wszystkich żółwi.

Przykład 1:

to model :p  ;funkcja - konstruktor klasy "model":
  make "l 0      ;zmienna globalna - publicznie dostępna
  to fn :x       ;funkcja składowa klasy "model":
    make "l :x     ;zapamiętaj ostatni argument w :l
    output :x^:p   ;wynik - potęga :p argumentu funkcji
  end
end

;trzy żółwie klasy "model" o różnych wartościach :p
make "t (list (newt $model 2) (newt $model 3) (newt $model 5))
print :t

;instukcja "who" i funkcja "fn :x" wywołane dla każdego żółwia
foreach "z :t [(print who @ :z (fn repcount) @ :z)]

;zmienna :l każdego żółwia
foreach "z :t [print :l @ :z]

Rezultat wykonania:

[model1 model2 model3]
model1 1
model2 8
model3 243
1
2
3

Przykład 2:

to model :h0 :c
  to krok        ;funkcja składowa klasy "model"
    rt :a fd :v
    "a := :a + rnorm 2
    if abs :a > 30 ["a := 30 * sign :a]
    "v := :v + rnorm 0.1
    if :v < 0 ["v := 0]
  end

  ;każdy żółw posiada własne zmienne:
  make "v 3      ;zmienna publiczna (globalna)
  let "a 0       ;zmienna chroniona (lokalna)

  seth :h0       ;ustaw początkowy kierunek żółwia
  setpc :c       ;ustaw kolor pisaka żółwia
end

wrap
"n := 5
repeat :n [ ;utwórz :n żółwi klasy "model"
  "h := 360 * repcount / :n   ;kierunek żółwia
  "c := 1000 * repcount / :n  ;kolor pisaka żółwia
  "t := (newt $model :h :c)   ;...i konstruktor żółwia
]
ht

"ts := children ;lista żółwi utwożonych przez #first

;stoper, który regularnie wywołuje funkcję "krok":
let "cyk timer [
  foreach "t :ts [krok @ :t;wywołaj "krok" każdego żółwia
  if :iter % 100 = 0 [       ;co 100 iteracji oblicz średnią :v
    let "s 0
    foreach "t :ts ["s := :s + :v @ :t;sumuj :v każdego żółwia
    print :s / count :ts
  ]
] 10

Rezultat wykonania:
(program rysuje także w oknie graficznym)

3.60541860738304
3.24327855650685
3.35303447692073
2.92485334993107
3.17479251202894
3.43988973971224
...

Zobacz także:

Definicja i wywołanie funkcji
Odczytanie zmiennej i wyniku funkcji
Zmienne, dostęp do danych

Żółw - obiekt
#, turtle - odczytaj żółwia

Funkcja jako wartość
$, func - odczytaj funkcję

Spis treści