Additionner des objets
Fait partie de la section Programmation orientée objet du Journey Lua de Coddy. Leçon 26 sur 70.
Vous avez déjà vu comment des métaméthodes comme __tostring et __eq vous permettent de personnaliser le comportement des objets. Nous allons maintenant étendre cela aux opérations arithmétiques, en commençant par l’addition.
La métaméthode __add définit ce qui se passe lorsque vous utilisez l’opérateur + entre deux objets. Lorsque Lua rencontre a + b, il recherche __add dans la métatable de l’un ou l’autre opérande.
local Vector = {}
Vector.__index = Vector
function Vector:new(x, y)
local obj = {x = x, y = y}
setmetatable(obj, Vector)
return obj
end
function Vector.__add(v1, v2)
return Vector:new(v1.x + v2.x, v1.y + v2.y)
endRemarquez que __add est défini avec un point, et non avec deux-points. Il reçoit les deux opérandes comme arguments et doit renvoyer un nouvel objet plutôt que de modifier l’un ou l’autre objet d’origine. Cela rend l’opération prévisible et sûre.
local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b
print(c.x, c.y) -- Sortie : 4 6L’idée essentielle est que __add doit se trouver dans la metatable elle-même (ici, Vector), et pas seulement dans l’objet. Puisque nous définissons Vector comme la metatable de toutes les instances, elles partagent toutes automatiquement ce comportement.
Défi
FacileConstruisons une classe Vector qui prend en charge l’addition à l’aide de l’opérateur +. Il s’agit de votre première étape vers la surcharge des opérateurs, qui permet à vos objets de fonctionner naturellement avec les opérateurs intégrés de Lua.
Vous organiserez votre code sur deux fichiers :
Vector.lua: définissez votre classe Vector avec les composantsxety. Incluez un constructeur:new(x, y)et implémentez la méthode métaméthode__addafin que l’addition de deux vecteurs crée un nouveau vecteur avec les composants combinés. N’oubliez pas que__addutilise la syntaxe avec un point (et non avec deux-points) et reçoit les deux opérandes comme arguments.main.lua: importez votre module Vector, créez des instances de vecteur et montrez que leur addition produit le résultat correct.
Vous recevrez quatre valeurs en entrée :
- La composante x du premier vecteur
- La composante y du premier vecteur
- La composante x du deuxième vecteur
- La composante y du deuxième vecteur
Dans votre fichier principal, créez deux vecteurs avec les composantes données, additionnez-les à l’aide de l’opérateur + et affichez les valeurs x et y du vecteur résultant sur des lignes séparées.
Par exemple, si les valeurs d’entrée sont 3, 4, 1, 2, la sortie doit être :
4
6Le premier vecteur (3, 4) plus le deuxième vecteur (1, 2) donne un nouveau vecteur (4, 6).
Essayez vous-même
-- Requiert le module Vector
local Vector = require('Vector')
-- Lire l'entrée
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())
-- TODO: Créer deux instances de Vector en utilisant les valeurs d'entrée
-- TODO: Ajouter les deux vecteurs en utilisant l'opérateur +
-- TODO: Afficher les valeurs x et y du vecteur résultant sur des lignes séparées
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Le concept de « self »
Tables avec fonctions« self » expliciteLa syntaxe avec deux-pointsPoint vs deux-pointsRécapitulatif - Point mobile4Projet : Banque numérique
Configuration du projetMéthode de dépôt7Polymorphisme et Redéfinition
Redéfinition de méthodesAppeler des méthodes parentesDuck TypingInterface communeVérification du typeRécapitulatif - Rôles des employés10Projet : Gestionnaire de formes
Configuration du projetClasse RectangleClasse CercleMéthode PérimètreCollection de formesAire totaleFiltrer les formes2Modèle de prototype de classe
Le concept de prototypeLiaison avec __indexLe constructeur :new()Initialisation des attributsInstances indépendantesRécapitulatif - Usine de voitures5Surcharge d'opérateurs en POO
Additionner des objetsSoustraire des objetsConcaténer des objetsComparer des objets (<, >)Récapitulatif - Calculs de portefeuille8Encapsulation
Conventions de nommageClosures pour la confidentialitéAccès via les ClosuresTables en lecture seuleLogique de validationRécapitulatif - Coffre-fort sécurisé11Patrons de conception (Lite)
Fonctions FactoryTable SingletonPatron IteratorObserver (Écouteur)Récapitulatif - Logger Factory3État et comportement des objets
Variables d'instanceMéthodes GetterMéthodes SetterPropriétés calculéesFormatage de chaînesVérifications d'égalitéRécapitulatif - Note de l'étudiant6Bases de l'héritage
Mise en place de l'héritageHériter des méthodesÉtendre le constructeurAjouter des méthodes enfantsPartagé vs UniqueRécapitulatif - Hiérarchie des formesEntraînez-vous par vous-même : Compilateur Lua en ligne