Quand Papa et Maman font gologolo âŠ
Ou, il y a hĂ©ritage et apprentissage ⊠Attention, article torride âŠ
Rappel sur les DynamicObjects + mixin
Ok, elle Ă©tait facile ⊠Mais voyons comment aller un peu plus loin avec les DynamicObjects par lâexemple.
Nous avons un âFlintStoneâ :
function FlintStone = -> DynamicObject():
lastName("Flintstone"):
define("initialize", |this, firstName|{
this: firstName(firstName)
return this
})
Commençons par crĂ©er un couple de âFlintStoneâ :
function Father = -> DynamicObject():
mixin(FlintStone()):
hair("brown"):
sex("male"):
define("fishing", |this| -> println(this: firstName() + " is fishing") )
function Mother = -> DynamicObject():
mixin(FlintStone()):
hair("red"):
sex("female"):
define("drawing", |this| -> println(this: firstName() + " is drawing") )
Donc les femmes âFlintStoneâ savent dessiner et sont rousses, les hommes âFlintStoneâ savent pĂȘcher et sont bruns. Father
et Mother
âdescendentâ tous kes 2 de FlintStone
.
Donc ceci :
function main = |args| {
var fred = Father(): initialize("Fred")
var wilma = Mother(): initialize("Wilma")
fred: fishing()
wilma: drawing()
}
vous donnera cela :
Fred is fishing
Wilma is drawing
Wilma et Fred vont faire des bébés : ou Golo & le multi-héritage
Une âpetiteâ chose que jâai oubliĂ© la derniĂšre fois, câest que lâon peut âcumulerâ les mixins !
Déclarons des bébés filles et des bébés garçons :
function BabyBoy = -> DynamicObject():
mixin(Mother()): mixin(Father())
function BabyGirl = -> DynamicObject():
mixin(Father()): mixin(Mother())
Donc un BabyBoy
âhĂ©riteâ des caractĂ©ristiques de sa mĂšre (Mother
) puis de celles de son pĂšre (Father
), donc si le pĂšre et la mĂšre ont des caractĂ©ristiques communes, celles du pĂšre âprennent le pasâ sur celle de la mĂšre (une sorte de surcharge de caractĂ©ristique). Et inversement dans le cas des BabyGirl
.
Laissons donc Fred et Wilma avoir des bĂ©bĂ©s en leur ajoutant quelques capacitĂ©s âĂ la volĂ©eâ :
function main = |args| {
var fred = Father(): initialize("Fred")
var wilma = Mother(): initialize("Wilma")
# Fred est devenu un adulte, il peut ...
fred: define("gologolo", |this, flintstone| {
if flintstone: sex() == "female" {
flintstone: pregnant(true)
} else {
raise("c'est pas gagné")
}
})
# Wilma est une femme, elle peut avoir des enfants
wilma: define("birthOfTwins", |this, girlsName, boysName| {
if this: pregnant() {
this: daughter(BabyGirl(): initialize(girlsName))
this: son(BabyBoy(): initialize(boysName))
}
})
# Fred & Wilma passent une bonne soirée
fred: gologolo(wilma)
# 9 mois plus tard, Wilma accouche de jumeaux
wilma: birthOfTwins("Pebbles", "Junior")
var pebbles = wilma: daughter()
var junior = wilma: son()
println(pebbles: hair() + " " + pebbles: lastName() + " " + pebbles: sex())
println(junior: hair() + " " + junior: lastName() + " " + junior: sex())
pebbles: fishing()
pebbles: drawing()
junior: fishing()
junior: drawing()
}
Et nous obtiendrons :
red Flintstone female
brown Flintstone male
Pebbles is fishing
Pebbles is drawing
Junior is fishing
Junior is drawing
Donc, Peebles et Junior ont bien hérités de caractéristiques en provenance à la fois des mùles et des femelles FlintStone
(dessiner et pĂȘcher), ainsi que de caractĂ©ristiques spĂ©cifiques Ă leur sexe (couleur de cheveux).
Les enfants grandissent : lâapprentissage
Il nây a pas que lâhĂ©ritage pour obtenir des compĂ©tences, il y a aussi lâapprentissage. Tout ça pour dire que lâon peut faire aussi du mixin Ă la volĂ©e. RĂ©initialisons une peebles
et un junior
, et créons un DynamicObject teacher
qui va pouvoir transférer ses connaissances en maths :
function main = |args| {
# bébés éprouvettes
var pebbles = BabyGirl(): initialize("Pebbles")
var junior = BabyBoy(): initialize("Junior")
# C'est un prof de math
var teacher = -> DynamicObject():
knowledge("mathematics"):
define("teaching", |this, somebody| {
somebody:mixin(this)
})
# teatcher enseigne Ă pebbles
teacher(): teaching(pebbles)
println("Pebbles loves " + pebbles: knowledge())
# qui du coup va pouvoir elle mĂȘme transfĂ©rer son savoir Ă son frĂšre
pebbles: teaching(junior)
# qui lui mĂȘme ...
println("Junior loves " + junior: knowledge())
}
Vous obtiendrez :
Pebbles loves mathematics
Junior loves mathematics
Donc nous venons de voir quâil est possible de transfĂ©rer facilement de DynamicObject en DynamicObject les membres de ceux-ci.
Conclusion : les mixins sont trĂšs puissants et permettent une approche fonctionnelle de lâhĂ©ritage, et finalement le terme âhĂ©ritageâ seul nâest plus appropriĂ©. Si jâosais, je dirais âune approche fonctionnelle de la vieâ ;)
42.
Tweet