Appel au constructeur de la classe mère

Vous êtes très certainement nombreux à avoir remarqué que l’utilisation des classes en Lua sur TI-Nspire était pratique, mais trop simple pour optimiser le code dans certains cas de figure.

Ce cas particulier est la possibilité d’appeler le constructeur de la classe mère dans le constructeur de la classe fille pour éviter de répéter les instructions. En effet, au moindre changement de champs dans la classe mère impliquait qu’il faille changer toutes les classes filles pour les modifier en conséquence.

Voici un exemple :

A = class()
function A:init(x)
  self.t = 0
  self.x = x
end
 
B = class(A)
function B:init(x, y)
  self.t = 0
  self.x = x
  self.y = y
end

Ici, si on veut changer t = 0 du constructeur de la class mère, il faudrait alors changer également le constructeur de la classe B pour rester cohérent. Une première approche consiste à procéder comme suit :

A = class()
function A:init(x)
  self.t = 0
  self.x = x
end
 
B = class(A(0, 0)) -- construction of the object before inheriting
function B:init(x, y)
  self.x = x
  self.y = y
end

Mais là encore, le champ x est répété.

Une chose que nous avons oublié de considérer ici est que B est une classe héritée de A, donc les champs de A sont forcément répétés dans B. Pourtant le constructeur de B, on est justement en train de le redéfinir en écrasant celui venant de A. N’y a-t-il pas moyen d’appeler le constructeur de A tout en passant l’objet B en paramètre ?

Et bien oui !

Une picure de rappel pour bien comprendre est cependant nécessaire. En effet, faire ceci :

dummy = class()
function dummy:doSomething()
  self.mark = 0
end
dummy:doSomething()

revient exactement au même que faire cela :

dummy = class()
function dummy.doSomething(self)
  self.mark = 0
end
dummy.doSomething(dummy)

ou encore :

dummy = class()
function dummy:doSomething()
  self.mark = 0
end
dummy.doSomething(dummy)

La présence des doubles points permet de passer automatiquement en 1er paramètre l’objet portant la méthode. Donc rien de nous empêche de ne pas utiliser ce sucre syntaxique pour faire passer un autre objet à la place de l’objet portant la propriété !

Ce qui revient à faire comme suit :

A = class()
function A:init(x)
  self.t = 0
  self.x = x
end
 
B = class(A)
function B:init(x, y)
  A.init(self, x) -- call the A class constructor in order to avoir repetitions
  self.y = y
end

Laisser un commentaire