Язык программирования C#9 и платформа .NET5. Страница 200
До появления обобщений единственный способ решения проблемы, касающейся безопасности в отношении типов, предусматривал создание вручную специального класса (строго типизированной) коллекции. Предположим, что вы хотите создать специальную коллекцию, которая способна содержать только объекты типа
Personnamespace IssuesWithNonGenericCollections{ public class Person { public int Age {get; set;} public string FirstName {get; set;} public string LastName {get; set;} public Person(){} public Person(string firstName, string lastName, int age) { Age = age; FirstName = firstName; LastName = lastName; } public override string ToString() { return $"Name: {FirstName} {LastName}, Age: {Age}"; } }}Чтобы построить коллекцию, которая способна хранить только объекты
PersonSystem.Collection.ArrayListPeopleCollectionPersonSystem.ObjectSystem.CollectionsSystem.Collections.Specializedusing System.Collections;namespace IssuesWithNonGenericCollections{ public class PersonCollection : IEnumerable { private ArrayList arPeople = new ArrayList();<b> // Приведение для вызывающего кода.</b> public Person GetPerson(int pos) => (Person)arPeople[pos];<b> // Вставка только объектов Person.</b> public void AddPerson(Person p) { arPeople.Add(p); } public void ClearPeople() { arPeople.Clear(); } public int Count => arPeople.Count;<b> // Поддержка перечисления с помощью foreach.</b> IEnumerator IEnumerable.GetEnumerator() => arPeople.GetEnumerator(); }}Обратите внимание, что класс
PeopleCollectionIEnumerableforeachGetPerson()AddPerson()PersonusingProgram.csUserPersonCollection()using System;using System.Collections;using IssuesWithNonGenericCollections;// Операторы верхнего уровня в Program.csstatic void UsePersonCollection(){ Console.WriteLine("***** Custom Person Collection *****\n"); PersonCollection myPeople = new PersonCollection(); myPeople.AddPerson(new Person("Homer", "Simpson", 40)); myPeople.AddPerson(new Person("Marge", "Simpson", 38)); myPeople.AddPerson(new Person("Lisa", "Simpson", 9)); myPeople.AddPerson(new Person("Bart", "Simpson", 7)); myPeople.AddPerson(new Person("Maggie", "Simpson", 2));<b> // Это вызовет ошибку на этапе компиляции!</b> // myPeople.AddPerson(new Car()); foreach (Person p in myPeople) { Console.WriteLine(p); }}Хотя специальные коллекции гарантируют безопасность в отношении типов, такой подход обязывает создавать (в основном идентичные) специальные коллекции для всех уникальных типов данных, которые планируется в них помещать. Таким образом, если нужна специальная коллекция, которая могла бы оперировать только с классами, производными от базового класса
Car
Перейти на страницу:
Изменить размер шрифта: