Quand Papa et Maman font gologolo 


Ou, il y a héritage et apprentissage 
 Attention, article torride 


Rappel sur les DynamicObjects + mixin

cf. article précédent

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.

blog comments powered by Disqus

Related posts