La programmation orientée objet en Lua

Bonjour à tous,

Synopsis

Aujourd’hui, nous allons parler de la programmation en orientée objet en Lua.

La programmation orientée objet en Lua est un sujet souvent débattu et les gens supposent normalement que le Lua, par défaut, n’a aucun moyen d’implémenter une programmation orientée objet. Cependant, il est évident que plusieurs façons existent pour faire de la programmation orientée objet existent en Lua. Dans ce tutoriel je vais vous présenter 3 méthodes pour en faire.

Méthode 1

La programmation orientée objet avec des objets peut être facilement réalisée pour passer un objet (tableau) à une fonction et avoir ensuite cette fonction pour modifier le tableau. Voici un exemple de la manière dont cela peut être fait avec un constructeur « Hello World ».

local function new_hello_world()
    return {
        format = "Hello %s.",
        hello = "world"
    }
end

local function set_hello(self)
    self.hello = "world two"
end

local function print_hello(self)
    print(self.format:format(self.hello))
end

local object = new_hello_world()
print_hello(object) --> Hello world.
set_hello(object)
print_hello(object) --> Hello world two.

Problèmes

Cette méthode est souvent appelée « not object oriented » en raison du fait que les méthodes ne sont pas accessibles à l’intérieur de l’objet. Il est parfois étiqueté comme non fonctionnelle, bien que cela soit une forme de programmation qui prend un objet comme entrant, qui utilise l’objet et produit des informations sur la base de cet objet même (le fait que vous appeliez print() ne compte pas).

Méthode 2

La première méthode que je vous ai présenté ci-dessus n’incluait pas les méthodes à l’intérieur de l’objet. Donc cette seconde méthode inclura les méthodes lors du retour de l’objet d’origine.

local function set_hello(self)
    self.hello = "world two"
end

local function print_hello(self)
    print(self.format:format(self.hello))
end

local function new_hello_world()
    return {
        format = "Hello %s.",
        hello = "world",
        set_hello = set_hello,
        print_hello = print_hello
    }
end

local object = new_hello_world()
object:print_hello() --> Hello world.
object:set_hello()
object:print_hello() --> Hello world two.

Notes

L’utilisation de l’opérateur : équivaut à utiliser l’opérateur . le premier argument est placé à la gauche de l’opérateur :. Ce qui signifie que hello:print() est équivalent à hello.print(hello).

Problèmes

L’utilisation de cette méthode ne permet pas de créer facilement un format d’héritage comme extends ou implements qui existe dans d’autres languages.

Méthode 3

L’utilisation d’une méta-valeur index via setmetatable permet aux tableaux d’utiliser d’autres tableaux comme base de travail sans copier de valeurs. Avec cette méthode, nous en profiterons pour éviter de dupliquer les entrées.

local base_class = {
    metatable = {
        __index = base_class;
    };

    set_hello = function()
        self.hello = "world two"
    end

    print_hello = function()
        print(self.format:format(self.hello))
    end

    new = function()
        return setmetatable({hello = "world"}, base_class.metatable)
    end
}

local extended_class = {}
setmetatable(extended_class, {
    __index = base_class;
}
    
local object = extended_class:new()
object:print_hello()
object:set_hello()
object:print_hello()

Notes de fin

Ce ne sont pas la seule façon de faire de l’orientée objet en Lua, il en existe d’autre qui fonctionne tout aussi bien. Ce tutoriel a uniquement pour but de vous montrer certaines façons pour faire de la programmation orientée objet dans ce langage. Vous pourrez trouver bien d’autres manières d’en faire sur le internet.

Cordialement ошибка