d'Accueil de page

Classes et indexeurs

 

Introduction

Dans la leçon précédente, nous avons appris à créer et utiliser l'indexeur qui prenaient des paramètres de types primitifs. Juste comme nous faisions avec les types primitifs, vous pouvez créer un indexeur qui est d'un type de classe. Par exemple, vous pouvez créer une classe de sorte qu'un des ses champs déclaré comme rangée puisse être accédé avec un index directement appliqué à une instance de la classe.

 

Étude pratique : Présentation des indexeurs et des classes

  1. Commencer une nouvelle application de console appelée PropertyRental2
  2. Pour créer une nouvelle classe, sur le menu principal, cliquez projet - > Ajouter la classe…
  3. Placez le nom  Property et appuyez Enter
  4. Changez le fichier comme suit :
     
    using System;
    
    namespace PropertyRental2
    {
        public enum Condition
        {
            Excellent,
            Good,
            NeedsRepair,
            Unknown
        }
    
        public class Property
        {
            private long propCode;
            private Condition cond;
            private short beds;
            private float baths;
            private decimal val;
    
            public long PropertyCode
            {
                get { return propCode; }
                set { propCode = value; }
            }
    
            public Condition PropertyCondition
            {
                get { return cond; }
                set { cond = value; }
            }
    
            public short Bedrooms
            {
                get { return beds; }
                set { beds = value; }
            }
    
            public float Bathrooms
            {
                get { return (baths <= 0) ? 0.00f : baths; }
                set { baths = value; }
            }
    
            public decimal MonthlyRent
            {
                get { return (val <= 0) ? 0.00M : val; }
                set { val = value; }
            }
    
            public Property()
            {
                Random rnd = new Random();
                propCode = rnd.Next(100000, 999999);
                cond = Condition.Unknown;
                beds = 0;
                baths = 0.0f;
                val = 0.00M;
            }
    
            public override string ToString()
            {
                return "Property #:   " + PropertyCode +
                       "\nCondition:    " + PropertyCondition +
                       "\nBedrooms:     " + Bedrooms +
                       "\nBathrooms:    " + Bathrooms +
                       "\nMonthly Rent: " + MonthlyRent.ToString("C");
            }
        }
    }
  5. Pour créer une nouvelle classe, sur le menu principal, cliquez projet- > Ajouter la classe…
  6. Placez le nom PropertyListing et appuyez sur Enter
  7. Changez le fichier comme suit :
     
    using System;
    
    namespace PropertyRental2
    {
        public class PropertyListing
        {
            public Property[] props;
    
            public string this[long code]
            {
                get
                {
                    for (int i = 0; i < props.Length; i++)
                        if (code == props[i].PropertyCode)
                            return "Property #:   " + props[i].PropertyCode +
                                   "\nCondition:    " + 
    				props[i].PropertyCondition +
                                   "\nBedrooms:     " + props[i].Bedrooms +
                                   "\nBathrooms:    " + props[i].Bathrooms +
                                   "\nMonthly Rent: " + 
    				props[i].MonthlyRent.ToString("C");
                    return "Unidentifiable Property";
                }
            }
    
            public PropertyListing()
            {
                Random rnd = new Random();
                props = new Property[40];
    
                // Create a few properties ready to be rented
                props[0] = new Property();
                props[0].PropertyCode = rnd.Next(100000, 999999);
                props[0].PropertyCondition = Condition.Excellent;
                props[0].Bedrooms = 5;
                props[0].Bathrooms = 3.5f;
                props[0].MonthlyRent = 2650;
    
                props[1] = new Property();
                props[1].PropertyCode = rnd.Next(100000, 999999);
                props[1].PropertyCondition = Condition.Excellent;
                props[1].Bedrooms = 3;
                props[1].Bathrooms = 2.5f;
                props[1].MonthlyRent = 1750;
    
                props[2] = new Property();
                props[2].PropertyCode = rnd.Next(100000, 999999);
                props[2].PropertyCondition = Condition.Good;
                props[2].Bedrooms = 4;
                props[2].Bathrooms = 2.5f;
                props[2].MonthlyRent = 2450;
    
                props[3] = new Property();
                props[3].PropertyCode = rnd.Next(100000, 999999);
                props[3].PropertyCondition = Condition.Excellent;
                props[3].Bedrooms = 1;
                props[3].Bathrooms = 1.0f;
                props[3].MonthlyRent = 880;
    
                props[4] = new Property();
                props[4].PropertyCode = rnd.Next(100000, 999999);
                props[4].PropertyCondition = Condition.Excellent;
                props[4].Bedrooms = 3;
                props[4].Bathrooms = 2.5f;
                props[4].MonthlyRent = 1880;
    
                props[5] = new Property();
                props[5].PropertyCode = rnd.Next(100000, 999999);
                props[5].PropertyCondition = Condition.Good;
                props[5].Bedrooms = 2;
                props[5].Bathrooms = 1.0f;
                props[5].MonthlyRent = 1050;
    
                // Since we don't yet have a complete list of properties
                // Create some empty ones
                for (int i = 6; i < 40; i++)
                {
                    props[i] = new Property();
                }
            }
        }
    }
  8. Accédez au fichier Program.cs et  changez le comme suit :
     
    using System;
    
    namespace PropertyRental2
    {
        public class Program
        {
            static int Main()
            {
                PropertyListing properties = new PropertyListing();
                long lngCode;
    
                Console.WriteLine("Here is a list of our properties by code");
                for (int i = 0; i < 6; i++)
                    Console.WriteLine("Property Code: {0}",
    			properties.props[i].PropertyCode);
    
                try
                {
                    Console.Write("Enter Property Code: ");
                    lngCode = long.Parse(Console.ReadLine());
    
                    Console.WriteLine("======================================");
                    Console.WriteLine("Property Information");
                    Console.WriteLine("--------------------------------------");
                    Console.WriteLine(properties[lngCode]);
                    Console.WriteLine("======================================");
    
                }
                catch (FormatException)
                {
                    Console.WriteLine("=- Invalid Property Code -=");
                }
    
                return 0;
            }
        }
    }
  9. Appuyez Ctrl + F5 pour exécuter l'application. Voici un exemple :
     
    Here is a list of our properties by code
    Property Code: 355443
    Property Code: 653004
    Property Code: 800118
    Property Code: 839375
    Property Code: 148561
    Property Code: 697001
    Enter Property Code: 697001
    ======================================
    Property Information
    --------------------------------------
    Property #:   697001
    Condition:    Good
    Bedrooms:     2
    Bathrooms:    1
    Monthly Rent: $1,050.00
    ======================================
    Press any key to continue . . .
  10. Fermez la fenêtre DOS

Une propriété indexée basée sur un Nombre Entier

Avant de concevoir un indexeur basé sur une classe, créer d'abord la classe qui sera utilisée comme type de données. La classe peut être simple ou complexe selon que vous la jugez nécessaire. Voici un exemple d'une classe simple :

public class Student
{
    public string FirstName;
    public string LastName;
    public int Gender;
}

En créant la classe qui accueillera la propriété indexée, déclarez un champ rangée pour la classe. Puis, créer la propriété this avec les accessoires désirés. Voici un exemple :

public class Student
{
    public string FirstName;
    public string LastName;
    public int Gender;
}

public class SchoolRegistration
{
    Student[] std = new Student[5];

    public Student this[int i]
    {
        get { return std[i]; }
    }
}

Après avoir créé la classe d'indexation, vous pouvez l'utiliser et accéder à l'indexeur ; par exemple, vous pouvez recouvrer ses valeurs. Voici un exemple :

using System;

public class Student
{
    public string FirstName;
    public string LastName;
    public int Gender;
}

public class SchoolRegistration
{
    Student[] std = new Student[5];

    public Student this[int i]
    {
        get { return std[i]; }
    }

    public SchoolRegistration()
    {
        std[0] = new Student();
        std[0].FirstName = "Alfredo";
        std[0].LastName = "Olmos";
        std[0].Gender = 2;

        std[1] = new Student();
        std[1].FirstName = "Patricia";
        std[1].LastName = "Katts";
        std[1].Gender = 1;

        std[2] = new Student();
        std[2].FirstName = "Josiane";
        std[2].LastName = "Euler";
        std[2].Gender = 1;

        std[3] = new Student();
        std[3].FirstName = "Joan";
        std[3].LastName = "Jones";
        std[3].Gender = 3;

        std[4] = new Student();
        std[4].FirstName = "George";
        std[4].LastName = "Paulson";
        std[4].Gender = 2;
    }
}

public class Program
{
    static int Main()
    {
        SchoolRegistration pupils = new SchoolRegistration();

        for (int i = 0; i < 5; i++)
        {
	    Student pupil = pupils[i];

            Console.WriteLine("Student Information");
            Console.WriteLine("---------------------");
            Console.WriteLine("First Name: {0}", pupil.FirstName);
            Console.WriteLine("Last Name:  {0}", pupil.LastName);
            Console.WriteLine("Gender:     {0}\n",
                             (pupil.Gender == 1 ? "Female" :
                             (pupil.Gender == 2 ? "Male" : "Unknown")));
        }

        return 0;
    }
}

Ceci produirait :

Student Information
---------------------
First Name: Alfredo
Last Name:  Olmos
Gender:     Male

Student Information
---------------------
First Name: Patricia
Last Name:  Katts
Gender:     Female

Student Information
---------------------
First Name: Josiane
Last Name:  Euler
Gender:     Female

Student Information
---------------------
First Name: Joan
Last Name:  Jones
Gender:     Unknown

Student Information
---------------------
First Name: George
Last Name:  Paulson
Gender:     Male

Press any key to continue . . .

Étude pratique : Utiliser un Indexeur d'un Nombre Entier

  1. Pour créer un indexeur qui prend un nombre entier et renvoie un objet, accédez au fichier PropertyListing.cs et changez le comme suit :
     
    using System;
    
    namespace PropertyRental1
    {
        public class PropertyListing
        {
            public Property[] props;
    
            public Property this[int i]
            {
                get { return props[i]; }
            }
    
            public PropertyListing()
            {
                . . . No Change
            }
        }
    }
  2. Accédez au fichier Program.cs et changez le comme suit :
     
    using System;
    
    namespace PropertyRental2
    {
        public class Program
        {
            static int Main()
            {
                PropertyListing properties = new PropertyListing();
    
                Console.WriteLine("Here is a list of our properties");
                for (int i = 0; i < 6; i++)
                {
                    Property prop = properties[i];
    
                    Console.WriteLine("Property Information");
                    Console.WriteLine("--------------------------------------");
                    Console.WriteLine("Property #:   {0}", prop.PropertyCode);
                    Console.WriteLine("Condition:    {0}", 
    			prop.PropertyCondition);
                    Console.WriteLine("Bedrooms:     {0}", prop.Bedrooms);
                    Console.WriteLine("Bathrooms:    {0}", prop.Bathrooms);
                    Console.WriteLine("Monthly Rent: {0}", 
    			prop.MonthlyRent.ToString("C"));
                    Console.WriteLine("======================================");
                }
    
                return 0;
            }
        }
    }
  3. Appuyez Ctrl + F5 pour exécuter l'application
  4. Fermez la fenêtre DOS

Une propriété indexée utilisant un autre type primitif

L'exécution ci-dessus de la classe SchoolRegistration nous a facilement permis de placer un élément de la rangée en spécifiant son index basé sur un entier. Comme fait pour les types primitifs, un indexeur peut prendre un paramètre autre qu'un nombre entier. Dans certains cas, vous pouvez utiliser votre classe ou une classe créée par quelqu'un d'autre et devoir accéder à un élément de la rangée sans information autre que son index. Considérez le programme suivant :

public enum Classification
{
    Female,
    Male,
    Unknown
}

public class Student
{
    public long StudentID;
    public string FirstName;
    public string LastName;
    public Classification Gender;

    public override string ToString()
    {
        string str = "Student ID: " + StudentID +
                     "\nFirst Name: " + FirstName +
                     "\nLast Name:  " + LastName +
                     "\nGender:     " + Gender;
        return str;
    }
}

public class SchoolRegistration
{
    Student[] std = new Student[50];

    public Student this[...]
    {
    }
}

Précédemment, nous avons vu que vous pourriez créer un indexeur qui prend un type de nombre entier. Par exemple, nous avons vu qu'une chaîne de caractères (string) pourrait être utilisée comme index.

À ce jour, nous savons qu'une propriété de base indexée  produit (ou toutes les propriétés indexées que nous avons étudié jusqu'ici  produisent) seulement une valeur. Si vous avez une classe qui a seulement un champ, ce serait assez. Dans la réalité, la majeure partie du temps, une classe a beaucoup de champs. Dans ce cas, quand vous créez un indexeur, vous devez pouvoir vous rapporter à un élément exact de la rangée. Pour rendre ceci possible, vous devez définir une manière de se diriger à l'élément particulier que vous voulez. Une façon de le faire est d'utiliser un champ de la classe comme référence. C'est meilleur si ce champ contient des valeurs uniques parmi les autres éléments de la rangée. Pour notre classe d'étudiant, nous pourrions utiliser le champ StudentID (parce que nous nous assurerons que chaque étudiant a une identification unique). Vous pouvez commencer la propriété comme suit :

public class SchoolRegistration
{
    Student[] std = new Student[5];

    public Student this[long id]
    {
    }
}

Quand un utilisateur utilise cette propriété, il  ou elle doit fournir une valeur qui identifie uniquement un élément de la rangée. Vous en retour, quand vous obtenez cette valeur, vous pouvez la rechercher dans la rangée. Si vous la trouvez et la rangée a un accessoire get, vous pouvez alors renvoyer la valeur désirée mais appropriée. Voici comment ceci peut être fait :

public class SchoolRegistration
{
    Student[] students = new Student[50];

    public Student this[long id]
    {
        get
        {
            for (int i = 0; i < students.Length; i++)
            {
                if (students[i].StudentID == id)
                    return students[i];
            }
            // Unknown student or the number was not found
            return null;
        }
    }
}

Après avoir créé l'indexeur, vous pouvez l'utiliser. De nouveau, vous devez suivre les règles d'une méthode qui prend un argument et renvoie une valeur autre que void. Dans ce cas-ci, l'indexeur doit prendre une chaîne de caractères et il doit renvoyer un objet Student (Etudiant). Voici un exemple :

using System;

public enum Classification
{
    Female,
    Male,
    Unknown
}

public class Student
{
    public long StudentID;
    public string FirstName;
    public string LastName;
    public Classification Gender;

    public override string ToString()
    {
        string str = "Student ID: " + StudentID +
                     "\nFirst Name: " + FirstName +
                     "\nLast Name:  " + LastName +
                     "\nGender:     " + Gender;
        return str;
    }
}

public class SchoolRegistration
{
    Student[] students = new Student[50];

    public Student this[long id]
    {
        get
        {
            for (int i = 0; i < students.Length; i++)
            {
                if (students[i].StudentID == id)
                    return students[i];
            }
            // Unknown student or the number was not found
            return null;
        }
    }

    public SchoolRegistration()
    {
        students[0] = new Student();
        students[0].StudentID = 917294;
        students[0].FirstName = "Helene";
        students[0].LastName = "Mukoko";
        students[0].Gender = Classification.Female;

        students[1] = new Student();
        students[1].StudentID = 283764;
        students[1].FirstName = "Patrice";
        students[1].LastName = "Katts";
        students[1].Gender = Classification.Unknown;

        students[2] = new Student();
        students[2].StudentID = 192046;
        students[2].FirstName = "Armand";
        students[2].LastName = "Essono";
        students[2].Gender = Classification.Male;

        students[3] = new Student();
        students[3].StudentID = 618268;
        students[3].FirstName = "Bertrand";
        students[3].LastName = "Yamaguchi";
        students[3].Gender = Classification.Male;

        students[4] = new Student();
        students[4].StudentID = 820648;
        students[4].FirstName = "Hortense";
        students[4].LastName = "McNeal";
        students[4].Gender = Classification.Female;
    }
}

public class Program
{
    static int Main()
    {
        SchoolRegistration pupils = new SchoolRegistration();

        Student pupil = pupils[820648];

        Console.WriteLine("Student Information");
        Console.WriteLine("---------------------");
        Console.WriteLine("First Name: {0}", pupil.FirstName);
        Console.WriteLine("Last Name:  {0}", pupil.LastName);
        Console.WriteLine("Gender:     {0}\n", pupil.Gender);

        pupil = pupils[192046];

        Console.WriteLine("Student Information");
        Console.WriteLine("---------------------");
        Console.WriteLine("First Name: {0}", pupil.FirstName);
        Console.WriteLine("Last Name:  {0}", pupil.LastName);
        Console.WriteLine("Gender:     {0}\n", pupil.Gender);

        return 0;
    }
}

Ceci produirait:

Student Information
---------------------
First Name: Hortense
Last Name:  McNeal
Gender:     Female

Student Information
---------------------
First Name: Armand
Last Name:  Essono
Gender:     Male

Press any key to continue . . .
 

Page d'Accueil Copyright © 2007-2008, Yevol Suivant