Aller au contenu principal

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éfinir ToString()
  • 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})";
}
info

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

AspectC#Java
Propriété en lecture seulepublic string Nom { get; private set; }private String nom; + getNom()
Propriété lecture-écriturepublic int Force { get; set; }private int force; + getter + setter
Constructeurpublic Personnage(string nom, int force)public Personnage(String nom, int force)
Redéfinir toStringpublic override string ToString()@Override public String toString()
Null-safestring? 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


Que signifie `{ get; private set; }` sur une propriété C# ?


Quel mot-clé est obligatoire en C# pour redéfinir `ToString()` hérité de `object` ?


Comment crée-t-on une instance de Personnage avec le constructeur `Personnage(string nom, int pv, int force)` ?


Dans quelle situation `ToString()` est-il appelé automatiquement ?


Comment accède-t-on à la propriété `Nom` d'un objet `Personnage p` ?


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.


Bonne pratique - private set pour l'encapsulation

Dé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.


Bonne pratique - Pas besoin de 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.


Bonne pratique - ToString() lisible pour le débogage

Un 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

NotionRé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.
ConstructeurMê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.