A tuple kiterjeszthet egy másik tuple-t. A TUPLE: child < parent slots ;
egy olyan osztályt deklarál, amelynek a példányai egyben a parent
példányai is: a sajátjaik mellett megkapják a szülő slotjait is, és rajtuk
a szülő accessorai is működnek, pont mintha a gyermeken lettek volna
definiálva.
USING: accessors ;
TUPLE: animal name age ;
TUPLE: dog < animal breed ;
"Rex" 4 "labrador" dog boa .
! => T{ dog { name "Rex" } { age 4 } { breed "labrador" } }
"Rex" 4 "labrador" dog boa name>> . ! => "Rex" (inherited accessor)
boa slotjainak sorrendjeA boa konstruktor a slotokat deklarációs sorrendben, a szülőkkel
kezdve várja. A fenti dog esetében:
dog boa ( name age breed -- dog )
Egy unoka, puppy < dog , amely hozzáad egy weeks slotot, így nézne ki:
puppy boa ( name age breed weeks -- puppy )
Minden TUPLE: deklaráció létrehoz egy predikátumot (name?).
Öröklés esetén a predikátumok egymásba ágyazódnak. Minden leszármazott
kielégíti a felmenői predikátumait:
"Rex" 4 "labrador" dog boa
dup dog? . ! => t
dup animal? . ! => t
Ez viszont fordítva nem igaz: egy animal, amely nem dog, nem elégíti
ki a dog? predikátumot.
A generikus metódusok (M:, amelyeket a generics
mutat be) szintén felfelé diszpécselnek a hierarchiában: az animal-re
definiált metódus minden leszármazottnál lefut, hacsak egy konkrétabb
felülírás nem élvez elsőbbséget. Ezt rögtön a feladat után a
boatswains-bilge-ben látni fogod.
Egy természetbúvár a kaldera körül élő sárkányokat katalogizálja. Sok tulajdonságuk közös, minden sárkánynak van neve, színe és kora, mégis jellegzetes módon specializálódtak. Egy kis öröklődési fát építesz sárkányosztályokból, meg egyetlen szót, amely bármelyik leszármazottat megöregbíti.
Még az elején definiáld a teljes öröklődési fát tuple-osztályokból (a konstruktoraik a következő részfeladatokban jönnek):
dragon a name, color és age slotokkal.fire-dragon, a dragon alosztálya, amely egy flame-temp slotot
ad hozzá.ice-dragon, a dragon egy másik alosztálya, amely egy chill-temp
slotot ad hozzá.volcano-dragon, a fire-dragon alosztálya, amely egy
lava-volume slotot ad hozzá.Ezután adj a dragon-nek egy <dragon> konstruktort.
"Falkor" "white" 100 <dragon> name>> . ! => "Falkor"
Adj a fire-dragon-nak egy <fire-dragon> konstruktort.
"Smaug" "red" 500 1200 <fire-dragon> flame-temp>> . ! => 1200
"Smaug" "red" 500 1200 <fire-dragon> dragon? . ! => t
Adj az ice-dragon-nak egy <ice-dragon> konstruktort.
"Frosty" "blue" 200 -40 <ice-dragon> chill-temp>> . ! => -40
"Frosty" "blue" 200 -40 <ice-dragon> fire-dragon? . ! => f (siblings)
Adj a volcano-dragon-nak egy <volcano-dragon> konstruktort.
"Vesuvius" "red" 1000 1500 99 <volcano-dragon> dragon? . ! => t
"Vesuvius" "red" 1000 1500 99 <volcano-dragon> fire-dragon? . ! => t
Definiáld az age-dragon szót, hogy eggyel növelje bármely sárkány
(vagy leszármazott) age slotját. Nem ad vissza semmit.
"Falkor" "white" 100 <dragon> dup age-dragon age>> . ! => 101
Ugyanannak a szónak minden leszármazotton működnie kell, éppen ez a lényege a közös accessornak.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Factor nyelvet 47 fogalom163 feladat segítségével, valódi emberi mentorálással, mindez ingyen.