Home » Tutoriels ShiVa » TUTO : Surcharger une fonction lua

TUTO : Surcharger une fonction lua

Vous est-il arrivé de souhaiter modifier/adapter une fonction d’API de ShiVa ? Oui ?! moi aussi !

Cas concrêt : nous souhaitons adapter une fonction existante : xml.send, pour y inclure un log automatique à chaque appel.
Si l’on se fie à la documentation officielle, nous aurions procédé comme suit :

 

xml.send ( hXML, sURI )
log.message ( "L'envoi d'un xml à l'adresse ", sURI, " a débuté." )

Mais, la ligne de log devra être présente après la fonction xml.send à chaque fois qu’elle est employée. Cela peut être franchement gonflant de copier cette ligne autant de fois dans votre programme…

La solution vise à copier au runtime la fonction d’API dans une fonction temporaire, puis de l’appeller dans une seconde fonction et la substituer à la fonction d’API :

 

// fonction vide destinée à mémoriser la fonction intacte
------------------------------------------------------
function MyAIM.original_xml_send ( hXML, sURI )
------------------------------------------------------
------------------------------------------------------
end
------------------------------------------------------

// fonction applelant la fonction originale avec une partie supplémentaire : 
------------------------------------------------------
function MyAIM.override_xml_send ( hXML, sURI )
------------------------------------------------------

// appel à la fonction originale
local bOK = MyAIM.original_xml_send ( hXML, sURI )

// partie ajoutée : ici un message dans le log.
log.message ( "L'envoi d'un xml à l'adresse ", sURI, " a débuté." )

return bOK
------------------------------------------------------
end
------------------------------------------------------

// Ensuite, pour remplacer votre fonction par la fonction surchargée, procédez de cette manière, dans le onInit d une AIM :

MyAIM.original_xml_send = xml.send
xml.send = MyAIM.override_xml_send

Vous verrez à la compilation, une vilaine erreur… Car cette méthode est incompatible avec un export C++, mais pour tout autre export cela semble fonctionner…

 

A bientôt pour de nouvelles aventures ShiVaesques !

 

EDIT : For english people, you can read the english version (translated by Felix Caffier) : http://www.shiva-engine.com/wiki/general-tutorials/lua-function-overloading/

Laisser un commentaire