Soustraire des objets
Fait partie de la section Programmation orientée objet du Journey Lua de Coddy. Leçon 27 sur 70.
Tout comme __add gère l’opérateur +, la méthode méta __sub définit le comportement de l’opérateur -. Le modèle est identique. Tu définis une fonction qui reçoit deux opérandes et renvoie un nouvel objet.
local Color = {}
Color.__index = Color
function Color:new(r, g, b)
local obj = {r = r, g = g, b = b}
setmetatable(obj, Color)
return obj
end
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endLorsque vous travaillez avec des couleurs RGB, la soustraction peut produire des valeurs négatives. Dans les applications réelles, vous pouvez vouloir limiter les résultats à des plages valides (0-255), mais la structure fondamentale de la méthode métamodale reste la même.
local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim
print(result.r, result.g, result.b) -- Sortie : 150 120 80N’oublie pas : définis __sub avec un point (et non avec deux-points), car il s’agit d’une métaméthode que Lua appelle directement avec les deux opérandes comme arguments.
Défi
FacileCréons une classe Color qui prend en charge la soustraction à l’aide de l’opérateur -. Les couleurs sont représentées par des valeurs RGB, et soustraire une couleur d’une autre crée une nouvelle couleur dont chaque composante est la différence des composantes correspondantes.
Tu vas répartir ton code dans deux fichiers :
Color.lua: définis ta classe Color avec les composantesr,getb, qui représentent les valeurs du rouge, du vert et du bleu. Ajoute un constructeur:new(r, g, b)et implémente la métaméthode__subafin que soustraire deux couleurs crée une nouvelle couleur dont les composantes sont les différences correspondantes. N’oublie pas que__subutilise la syntaxe avec un point et reçoit les deux opérandes en arguments.main.lua: charge ton module Color, crée des instances de couleur à partir des valeurs fournies, soustrais-les et affiche les valeurs RGB obtenues.
Tu recevras six valeurs en entrée :
- Composante rouge de la première couleur
- Composante verte de la première couleur
- Composante bleue de la première couleur
- Composante rouge de la deuxième couleur
- Composante verte de la deuxième couleur
- Composante bleue de la deuxième couleur
Dans ton fichier principal, crée deux couleurs avec les valeurs RGB données, soustrais la deuxième couleur de la première à l’aide de l’opérateur -, puis affiche les valeurs r, g et b de la couleur obtenue, chacune sur une ligne distincte.
Par exemple, si les valeurs d’entrée sont 200, 150, 100, 50, 30, 20, la sortie devrait être :
150
120
80La première couleur (200, 150, 100) moins la deuxième couleur (50, 30, 20) donne une nouvelle couleur (150, 120, 80).
Essayez vous-même
-- Charger le module Color
local Color = require('Color')
-- Lire les valeurs d’entrée
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())
-- TODO: Créer deux instances de Color avec les valeurs RGB données
-- TODO: Soustraire la deuxième couleur de la première à l’aide de l’opérateur -
-- TODO: Afficher les valeurs r, g et b de la couleur obtenue sur des lignes distinctes
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