La classe de base 'object'
Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy — leçon 23 sur 70.
En C#, chaque classe que vous créez hérite automatiquement d'une classe spéciale appelée object. Même lorsque vous ne spécifiez pas explicitement de classe de base, votre classe a toujours object comme ancêtre ultime. Cela signifie que chaque type en C# partage un ensemble commun de méthodes.
La classe object fournit plusieurs méthodes virtuelles que vous pouvez redéfinir dans vos propres classes :
public class Person
{
public string Name { get; set; }
// Redéfinition depuis object
public override string ToString()
{
return $"Person: {Name}";
}
public override bool Equals(object obj)
{
if (obj is Person other)
return Name == other.Name;
return false;
}
public override int GetHashCode()
{
return Name?.GetHashCode() ?? 0;
}
}Les trois méthodes les plus couramment redéfinies sont ToString() pour la représentation sous forme de chaîne, Equals() pour comparer des objets et GetHashCode() pour les collections basées sur le hachage. Par défaut, ToString() retourne le nom du type et Equals() vérifie l'égalité des références.
Parce que tout hérite de object, vous pouvez stocker n'importe quel type dans une variable object :
object item1 = new Person { Name = "Alice" };
object item2 = 42;
object item3 = "Hello";
Console.WriteLine(item1.ToString()); // Person: AliceCette classe de base universelle est ce qui rend possibles des fonctionnalités telles que les collections contenant des types mixtes, et c'est pourquoi chaque objet en C# a accès à des méthodes telles que ToString() et GetType().
Défi
FacileConstruisons un système de comparaison de livres qui démontre comment la redéfinition des méthodes de la classe de base object donne à vos types personnalisés un comportement significatif pour la représentation sous forme de chaîne et la vérification de l'égalité.
Vous allez créer deux fichiers pour organiser votre code :
Book.cs: Définissez une classeBookdans l'espace de nomsLibrary. Votre livre doit avoir des propriétésTitle(string) etAuthor(string), ainsi qu'un constructeur qui définit ces deux valeurs. Redéfinissez les trois méthodes clés héritées deobject:ToString()doit retourner"{Title} by {Author}"Equals(object obj)doit retournertruesi l'autre objet est unBookavec les mêmesTitleetAuthorGetHashCode()doit combiner les codes de hachage des deux propriétés
Program.cs: Dans votre fichier principal, créez deux livres en utilisant les valeurs d'entrée. Affichez chaque livre en utilisantToString(), puis vérifiez s'ils sont égaux et affichez le résultat. Enfin, démontrez que vous pouvez stocker unBookdans une variableobjectet obtenir toujours une sortie significative lors de l'appel àToString().
Vous recevrez quatre entrées :
- Le titre du premier livre
- L'auteur du premier livre
- Le titre du deuxième livre
- L'auteur du deuxième livre
Affichez la sortie dans ce format :
Book 1: {ToString result}
Book 2: {ToString result}
Are they equal? {True/False}
Stored as object: {ToString result of first book stored in object variable}Par exemple, si les entrées sont 1984, George Orwell, 1984, et George Orwell, la sortie doit être :
Book 1: 1984 by George Orwell
Book 2: 1984 by George Orwell
Are they equal? True
Stored as object: 1984 by George OrwellSi les entrées sont 1984, George Orwell, Brave New World, et Aldous Huxley, la sortie doit être :
Book 1: 1984 by George Orwell
Book 2: Brave New World by Aldous Huxley
Are they equal? False
Stored as object: 1984 by George OrwellRemarquez comment vos méthodes redéfinies donnent aux objets Book un comportement significatif - ils s'affichent joliment sous forme de chaînes de caractères et peuvent être comparés par leur contenu plutôt que par leurs seules références mémoire !
Aide-mémoire
En C#, chaque classe hérite automatiquement de la classe object, qui fournit plusieurs méthodes virtuelles pouvant être remplacées :
Méthodes d'objet courantes à remplacer
ToString()- Retourne une représentation sous forme de chaîne de l'objet (par défaut, retourne le nom du type)Equals(object obj)- Compare les objets pour l'égalité (par défaut, vérifie l'égalité de référence)GetHashCode()- Retourne un code de hachage pour une utilisation dans des collections basées sur le hachage
Remplacement des méthodes d'objet
public class Person
{
public string Name { get; set; }
// Remplacer ToString pour une représentation de chaîne personnalisée
public override string ToString()
{
return $"Person: {Name}";
}
// Remplacer Equals pour une comparaison basée sur le contenu
public override bool Equals(object obj)
{
if (obj is Person other)
return Name == other.Name;
return false;
}
// Remplacer GetHashCode pour les collections basées sur le hachage
public override int GetHashCode()
{
return Name?.GetHashCode() ?? 0;
}
}Classe de base universelle
N'importe quel type peut être stocké dans une variable object :
object item1 = new Person { Name = "Alice" };
object item2 = 42;
object item3 = "Hello";
Console.WriteLine(item1.ToString()); // Person: AliceCet héritage universel permet des collections qui contiennent des types mixtes et garantit que chaque objet a accès à des méthodes telles que ToString() et GetType().
Essayez vous-même
using System;
using Library;
class Program
{
public static void Main(string[] args)
{
// Lire les entrées pour deux livres
string title1 = Console.ReadLine();
string author1 = Console.ReadLine();
string title2 = Console.ReadLine();
string author2 = Console.ReadLine();
// TODO: Créer deux objets Book en utilisant les valeurs d'entrée
// TODO: Afficher Book 1 en utilisant ToString()
// Format: "Book 1: {ToString result}"
// TODO: Afficher Book 2 en utilisant ToString()
// Format: "Book 2: {ToString result}"
// TODO: Vérifier si les livres sont égaux et afficher le résultat
// Format: "Are they equal? {True/False}"
// TODO: Stocker le premier livre dans une variable object et l'afficher
// Format: "Stored as object: {ToString result}"
}
}
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
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et Utilisateur