Récapitulatif - Gestionnaire de zoo
Fait partie de la section Programmation Orientée Objet du Journey Rust de Coddy. Leçon 48 sur 61.
Défi
FacileConstruisons un gestionnaire de zoo qui rassemble tous les concepts d’objets de trait que tu as appris ! Tu vas créer un système dans lequel différents animaux, chacun avec son propre cri, peuvent être stockés dans une seule collection et amenés à parler un par un.
Tu organiseras ton code dans deux fichiers :
animals.rs: définis un trait publicSpeakavec une méthodespeakqui prend&selfet renvoie uneString. Crée ensuite trois structs publiques,Dog,CatetBird, chacune avec un champ publicname(String). Implémente le traitSpeakpour chaque animal avec son cri caractéristique :- Dog doit renvoyer
{name} says: Woof! - Cat doit renvoyer
{name} says: Meow! - Bird doit renvoyer
{name} says: Tweet!
- Dog doit renvoyer
main.rs: ajoute ton module d’animaux et crée un zoo ! Construis unVec<Box<dyn Speak>>contenant un animal de chaque type à l’aide des entrées fournies. Ajoute-les dans l’ordre : Dog en premier, puis Cat, puis Bird. Enfin, parcours ton zoo et affiche le cri de chaque animal sur sa propre ligne.
Ce défi démontre la véritable puissance des objets de trait : trois types d’animaux complètement différents vivant ensemble dans une seule collection, chacun répondant à l’appel speak() avec son propre comportement.
Ta sortie doit afficher chaque animal en train de parler dans l’ordre :
{dog_name} says: Woof!
{cat_name} says: Meow!
{bird_name} says: Tweet!Par exemple, avec les entrées Rex, Whiskers et Tweety :
Rex says: Woof!
Whiskers says: Meow!
Tweety says: Tweet!Tu recevras trois entrées : le nom du chien, le nom du chat et le nom de l’oiseau.
Essayez vous-même
mod animals;
use animals::{Speak, Dog, Cat, Bird};
fn main() {
// Lire l'entrée pour les noms des animaux
let mut dog_name = String::new();
std::io::stdin().read_line(&mut dog_name).expect("Failed to read line");
let dog_name = dog_name.trim().to_string();
let mut cat_name = String::new();
std::io::stdin().read_line(&mut cat_name).expect("Failed to read line");
let cat_name = cat_name.trim().to_string();
let mut bird_name = String::new();
std::io::stdin().read_line(&mut bird_name).expect("Failed to read line");
let bird_name = bird_name.trim().to_string();
// TODO: Créer un Vec<Box<dyn Speak>> appelé zoo
// Ajouter les animaux dans l'ordre : Dog en premier, puis Cat, puis Bird
// TODO: Parcourir le zoo et afficher le son de chaque animal
}
Toutes les leçons de Programmation Orientée Objet
1Méthodes et comportement
Introduction aux blocs d'implémentationLe paramètre SelfMéthodes mutablesFonctions associéesBlocs d'implémentation multiplesChaînage de méthodesRécapitulatif - Actions sur le rectangle4Projet : Animal virtuel
Définir l'animalNourrir l'animal7Traits standards
Le trait DebugLe trait DisplayClone et CopyLes traits d'égalitéRécapitulatif - Point affichable10Projet : Système de documents
Le trait DrawComposant texte2Encapsulation et modules
Bases des modulesLe mot-clé publicChamps privésGettersSettersRécapitulatif - Casier sécurisé5Généricité
Structures génériquesMéthodes génériquesPlusieurs types génériquesFonctions génériquesRécapitulatif - Point de coordonnées8Les Traits comme contraintes
Syntaxe des contraintes de traitContraintes multiplesLa clause whereRetourner des types avec des traitsRécapitulatif - Afficheur générique11Design Patterns en Rust
Le pattern NewtypeCompositionLe trait DropFrom et IntoRécapitulatif - Mock de Smart Pointer3Enums avancées
Enums avec donnéesMéthodes sur les EnumsMatching des variantes de donnéesL'Enum Option revisitéeRécapitulatif - Enum Shape6Définition des Traits
Qu'est-ce qu'un Trait ?Implémenter des TraitsImplémentations par défautRedéfinir les comportements par défautTraits avec paramètresRécapitulatif - Lecteur multimédia9Objets de trait
Dispatch dynamiqueVecteurs de traitsItérer sur des objets de traitRécapitulatif - Gestionnaire de zooEntraînez-vous par vous-même : Compilateur Rust en ligne