Aire totale
Fait partie de la section Object Oriented Programming du Journey Lua de Coddy — leçon 60 sur 70.
Défi
FacileAjoutons une fonctionnalité puissante à votre ShapeCollection : la capacité de calculer l'aire totale de toutes les formes qu'elle contient. C'est ici que le polymorphisme brille vraiment : votre collection peut appeler :getArea() sur n'importe quelle forme sans savoir s'il s'agit d'un rectangle ou d'un cercle.
Vous continuerez à construire sur vos fichiers de projet existants :
Shape.lua: Votre classe de base Shape (inchangée).Rectangle.lua: Votre classe Rectangle avec:getArea()et:getPerimeter().Circle.lua: Votre classe Circle avec:getArea()et:getPerimeter().ShapeCollection.lua: Étendez votre classe de collection en ajoutant une méthode:getTotalArea(). Cette méthode doit parcourir toutes les formes stockées, appeler:getArea()sur chacune d'elles et retourner la somme de toutes les aires.main.lua: Importez vos modules, lisez les dimensions depuis l'entrée, créez un Rectangle et un Circle, ajoutez les deux à une ShapeCollection, puis affichez l'aire totale de toutes les formes de la collection.
La beauté de cette approche est que :getTotalArea() n'a pas besoin de logique distincte pour les rectangles et les cercles — elle fait simplement confiance au fait que chaque forme de la collection possède une méthode :getArea(). Vous pourriez ajouter des triangles, des hexagones ou n'importe quelle autre forme plus tard, et le calcul de l'aire totale fonctionnerait sans modification.
Entrée : Trois lignes — largeur (nombre), hauteur (nombre) et rayon (nombre).
Sortie : Une seule ligne contenant l'aire totale de toutes les formes de la collection.
Essayez vous-même
-- Requiert le module Rectangle
local Rectangle = require('Rectangle')
-- Requiert le module Circle
local Circle = require('Circle')
-- Requiert le module ShapeCollection
local ShapeCollection = require('ShapeCollection')
-- Lit la largeur et la hauteur depuis l'entrée
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())
-- Crée une nouvelle instance de Rectangle avec les dimensions données
local rect = Rectangle:new(width, height)
-- Crée une nouvelle instance de Circle avec le rayon donné
local circ = Circle:new(radius)
-- Crée une nouvelle ShapeCollection
local collection = ShapeCollection:new()
-- Ajoute les deux formes à la collection
collection:addShape(rect)
collection:addShape(circ)
-- Affiche l'aire totale de toutes les formes de la collection
print(collection:getTotalArea())
Toutes les leçons de Object Oriented Programming
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 Rectangle2Modè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 formes