|
Classes et indexeurs |
|
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. |
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 . . .
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, Yevol | Suivant |
|
|
||