2) Organiser son code
Organiser son code avec des classes
Objectifs de la séance
- Créer une classe C# avec des propriétés (différentes des getters/setters Java)
- Écrire un constructeur paramétré
- Implémenter la méthode
Afficher()et redéfinirToString() - Remplacer la liste de noms par une
List<Personnage>
Notions théoriques
Propriétés C# vs getters/setters Java
En Java, on protège les champs avec des getters et setters explicites. En C#, les propriétés remplacent ce mécanisme avec une syntaxe plus concise.
// Java (à titre de comparaison — ne pas écrire en C#)
// private String nom;
// public String getNom() { return nom; }
// public void setNom(String nom) { this.nom = nom; }
// C# — propriété auto-implémentée
class Personnage
{
public string Nom { get; set; }
public int PointsDeVie{ get; set; }
public int Force { get; set; }
}
Vous pouvez rendre une propriété accessible en lecture seule de l'extérieur :
public string Nom { get; private set; }
// L'extérieur peut lire Nom, mais seule la classe peut le modifier
Constructeur paramétré
class Personnage
{
public string Nom { get; private set; }
public int PointsDeVie { get; private set; }
public int Force { get; private set; }
public Personnage(string nom, int pointsDeVie, int force)
{
Nom = nom;
PointsDeVie = pointsDeVie;
Force = force;
}
}
// Utilisation
Personnage p = new Personnage("Kael", 100, 15);
Console.WriteLine(p.Nom); // Kael
Console.WriteLine(p.PointsDeVie); // 100
Méthode Afficher() et ToString()
Afficher() est une méthode que vous définissez selon vos besoins. ToString() est une méthode héritée de object que l'on redéfinit pour contrôler l'affichage automatique (lors d'une interpolation de chaîne, par exemple).
public void Afficher()
{
Console.WriteLine($"Personnage : {Nom} | PV : {PointsDeVie} | Force : {Force}");
}
public override string ToString()
{
return $"{Nom} (PV: {PointsDeVie}, Force: {Force})";
}
override est obligatoire en C# pour redéfinir une méthode héritée. Sans override, le compilateur vous avertit que vous cachez la méthode parent plutôt que de la redéfinir.
Tableau comparatif C# vs Java
| Aspect | C# | Java |
|---|---|---|
| Propri été en lecture seule | public string Nom { get; private set; } | private String nom; + getNom() |
| Propriété lecture-écriture | public int Force { get; set; } | private int force; + getter + setter |
| Constructeur | public Personnage(string nom, int force) | public Personnage(String nom, int force) |
| Redéfinir toString | public override string ToString() | @Override public String toString() |
| Null-safe | string? nom ou opérateur ?? | Optional<String> ou @Nullable |
Exemple pratique
using System;
using System.Collections.Generic;
class Personnage
{
// Propriétés C# : pas de getters/setters explicites
public string Nom { get; private set; }
public int PointsDeVie { get; private set; }
public int Force { get; private set; }
public Personnage(string nom, int pointsDeVie, int force)
{
Nom = nom;
PointsDeVie = pointsDeVie;
Force = force;
}
public void Afficher()
{
Console.WriteLine($"[{Nom}] PV : {PointsDeVie} Force : {Force}");
}
public override string ToString()
=> $"{Nom} (PV : {PointsDeVie}, Force : {Force})";
}
// Programme principal
List<Personnage> personnages = new();
personnages.Add(new Personnage("Kael", 100, 15));
personnages.Add(new Personnage("Aria", 80, 20));
personnages.Add(new Personnage("Theron", 120, 12));
foreach (Personnage p in personnages)
{
p.Afficher();
}
// ToString() est appelé automatiquement dans une interpolation
Personnage choisi = personnages[0];
Console.WriteLine($"\nPersonnage choisi : {choisi}");
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Étape 1 — Créer la classe Personnage
Créez la classe Personnage avec les propriétés Nom (string), PointsDeVie (int) et Force (int). Les propriétés doivent être lisibles de partout mais modifiables uniquement dans la classe.
private set pour l'encapsulationDéclarer private set empêche le code extérieur d'écrire personnage.PointsDeVie = -10;. Toute modification passe par des méthodes contrôlées de la classe, ce qui protège l'intégrité des données.
Étape 2 — Ajouter le constructeur
Ajoutez un constructeur qui initialise les trois propriétés.
this en C#En Java, on écrit souvent this.nom = nom pour lever l'ambiguïté. En C#, la convention de nommage évite ce conflit : la propriété est Nom (PascalCase) et le paramètre est nom (camelCase). Ils sont différents, donc this est inutile ici.
Étape 3 — Implémenter ToString() et créer des personnages
Implémentez ToString() puis créez une List<Personnage> avec au moins deux personnages et affichez-les.
ToString() lisible pour le débogageUn bon ToString() vous permet d'afficher vos objets directement dans les messages de log ou dans les interpolations sans code supplémentaire. Habituez-vous à le redéfinir dès la création d'une classe.
📌 Une solution
Ce qu'il faut retenir
| Notion | Résumé |
|---|---|
Propriété { get; set; } | Remplace les getters/setters Java. Accès et modification publics. |
Propriété { get; private set; } | Lecture publique, modification réservée à la classe. |
| Constructeur | Même syntaxe qu'en Java. Pas besoin de this si noms différents (PascalCase vs camelCase). |
override ToString() | Redéfinit l'affichage automatique de l'objet. Appelé dans les interpolations $"". |
List<Personnage> | Collection typée d'objets. .Add(), foreach, accès par index. |
Aperçu de la prochaine séance
Dans la prochaine séance, vous allez spécialiser la classe Personnage avec l'héritage. Vous créerez une classe abstraite Personnage et des sous-classes concrètes : Guerrier, Mage, Archer, chacune avec une méthode d'attaque différente. Vous verrez comment les mots-clés abstract, virtual et override structurent la hiérarchie.