Пример использования семейства System.Collections.ArrayList
Лекция 17. Семейства. Индексаторы
В предыдущем семестре рассматривался особый тип - массивы для создания таких типов переменных, в которых содержится несколько объектов или значений. У массивов, однако, имеются определенные ограничения. Наиболее существенным из них является то, что после создания массива его размеры должны оставаться неизменными, поэтому дописывать новые элементы в конец уже существующего массива нельзя — требуется создавать новый массив. Методы ООП позволяют создавать классы, которые выполняют существенную часть этих манипуляций внутренним образом, упрощая тем самым код, в котором используются списки элементов или массивы.
Массивы в С# реализованы как экземпляры класса System.Array и представляют собой один из тех типов, которые известны под названием классов семейств.
Семейства— это объекты, в которых могут содержаться массивы других объектов и которые обладают функциональными возможностями для организации доступа к ним.
Классы семейств используются для работы со списками объектов и по сравнению с обычными массивами обладают некоторыми дополнительными функциональными возможностями. Эти возможности возникают за счет реализации интерфейсов из пространства имен System.Сollections, что позволяет стандартизировать синтаксис семейств. В пространстве имен содержатся также и некоторые другие интересные вещи, например, классы, которые реализуют интерфейсы отличными от класса System.Array способами.
Функциональные возможности семейств такие как доступ к членам семейств с использованием синтаксиса [индекс], реализуются посредством интерфейсов. У программистов имеется возможность создавать свои собственные классы семейств. Такие классы могут соответствовать объектам, с которыми их планируется использовать (т. е. тем объектам, из которых планируется создавать семейство). Одно из преимуществ такого подхода заключается в том, что создаваемые классы семейств могут быть строго типизированы.Это означает, что при извлечении элементов из семейства не требуется приводить их типы к требуемому типу.
В пространстве имен System.Collections существуют интерфейсы, которые обеспечивают выполнение базовых функциональных возможностей семейств:
Интерфейс IEnumerable - позволяет просматривать элементы семейств в цикле.
Интерфейс ICollection - позволяет получать общее число элементов в семействе, а также копировать элементы семейства в обычный массив.
Интерфейс IList - предоставляет список элементов семейства и доступ к этим элементам, а также некоторые другие базовые возможности, имеющие отношение к работе со списками элементов.
Интерфейс IDictionary аналогичен интерфейсу IList, но предоставляет список элементов, доступ к которым осуществляется не с помощью индекса, а посредством некоторого ключевого значения.
Класс System.Array наследуется от IList, ICollection и IEnumerable, однако он не поддерживает некоторые наиболее мощные возможности интерфейса IList и представляет список элементов только фиксированной длины.
Пример использования семейства System.Collections.ArrayList
Класс System.Collections.ArrayList — один из классов в пространстве имен System.Collections — тоже реализует интерфейсы IEnumerable, ICollection и IList. В то время как массивы обладают фиксированным размером (нет возможности добавлять или исключать элементы), этот класс может использоваться для представления списков элементов переменной длины. Чтобы получить представление о том, какими возможностями обладают такие усложненные семейства, рассмотрим пример, в котором наряду с классом System.Collections.ArrayList будет использоваться и обыкновенный массив.
using System;
using System.Collections;
…
public abstract class Animal //абстрактный класс Животное
{
protected string name;
public string Name
{
get
{return name;}
set
{name = value;}
}
public Animal()
{name = "Животное без имени";}
public Animal(string newName)
{name = newName;}
public void Feed()
{Console.WriteLine("{0} кушает ", name);}
}
public class Cow: Animal //класс Корова, производный от абстрактного
{
public void Milk()
{Console.WriteLine("{0} дает молоко", name);}
public Cow(string newName): base(newName) //конструктор вызывает базовый конструктор
{}
}
public class Chicken : Animal //класс Курица, производный от абстрактного
{
public void LayEgg()
{
Console.WriteLine("{0} несет яйца", name);
}
public Chicken(string newName): base(newName)
{}
}
class Class
{
static void Main(string[] args)
{
Console.WriteLine("Создание нового массива животных в виде стандартного Array: " );
//СТРОГО ФИКСИРОВАННОЕ КОЛИЧЕСТВО ЭЛЕМЕНТОВ!
Animal[] animalArray = new Animal[2];
Cow myCow1 = new Cow("Буренка1") ;
//2 способа задания элементов массива
//1 способ - путем присваивания уже существующего объекта класса Cow
animalArray[0] = myCow1;
//2 способ – через создание нового объекта класса Chicken
animalArray[1] = new Chicken("Курица1") ;
Основное отличие между этими способами заключается в том, что в первом случае мы получаем ссылку на объект, находящийся в массиве. В семействе ArrayList не существует никаких элементов, даже ссылающихся на null.
Класс System.Array реализует интерфейс IEnumerable, а единственный метод этого интерфейса - GetEnumerator(), позволяет проходить в цикле по всем элементам семейства.
foreach (Animal myAnimal in animalArray) //цикл перебора по 1 элементу в массиве
{
Console.WriteLine(" Новый {0} элемент добавлен в массив," +
"имя = {1}", myAnimal.ToString(), myAnimal.Name);
}
//использование свойства Length, стандартного для класса System.Array
Console.WriteLine("Массив содержит {0} элементов",animalArray.Length);
//метод Feed() есть у всех производных от Animal
animalArray[0].Feed();
//метод LayEgg() есть только у класса Chicken, поэтому здесь явное приведение типов
((Chicken)animalArray[1]).LayEgg();
//Демонстрация работы с семейством - классом ArrayList
Console.WriteLine("Использование класса ArrayList");
ArrayList animalArrayList = new ArrayList();
Cow myCow2=new Cow("Буренка2");
//2 способа задания элементов массива
//КОЛИЧЕСТВО ЭЛЕМЕНТОВ НЕ ФИКСИРУЕТСЯ, использовать метод Add()
animalArrayList.Add(myCow2);
animalArrayList.Add(new Chicken ("Курица 2"));
foreach (Animal myAnimal in animalArrayList)
{
Console.WriteLine(" Новый {0} элемент добавлен в ArrayList," + " имя = {1}", myAnimal.ToString(), myAnimal.Name);
}
//использование свойства Count для класса ArrayList
Console.WriteLine("Массив содержит {0} элементов",animalArrayList.Count);
Семейства — независимо от того, являются ли они массивами или более сложными семействами — должны предусматривать обеспечение доступа к принадлежащим им элементам. Простые массивы строго типизированы, т. е. они обеспечивают непосредственный доступ к типу своих элементов. Семейство ArrayList — это семейство объектов класса System.Object. Это значит, что необходимо выполнить приведение типа для всех его элементов:
//так как ArrayList содержит разные экземпляры классов, то для вызова соответcтвующих //методов необходимо применить соответствующие преобразования
((Animal)animalArrayList[0]).Feed();
((Chicken)animalArrayList[1]).LayEgg();
Console.WriteLine("Демонстрация действий с ArrayList:");
//метод RemoveAt() удаляет заданный элемент (по индексу) из списка
animalArrayList.RemoveAt(0);
//единственным элементом, оставшимся в семействе, является объект класса chicken,
//доступ к которому осуществляется следующим образом:
((Animal)animalArrayList[0]).Feed();
Выполнение любых операций над элементами объекта ArrayList, в результате которых в этом массиве останется N элементов, будет производиться таким образом, что этим элементам будут соответствовать индексы в диапазоне от 0 до N-I. Так, например, удаление элемента с номером 0 приводит к тому, что все остальные элементы сдвигаются в массиве на одну позицию, поэтому доступ к объекту класса Chicken осуществляется с индексом 0, а не 1. А поскольку теперь в массиве не существует элемента с индексом 1 (с самого начала было всего два элемента), то при попытке выполнить следующий код будет сгенерирована исключительная ситуация: ((Animal)animalArrayList[1]).Feed();
//метод AddRange() добавляет в список несколько элементов – в данном случае - массив
animalArrayList.AddRange(animalArray);
((Chicken)animalArrayList[2]).LayEgg();
//использование свойства IndexOf для класса ArrayList
Console.WriteLine("Животное {0} с индексом {1}", myCow1.Name, animalArrayList.IndexOf(myCow1));
myCow1.Name="Новая Буренка1";
//использование свойства Name, определенного в классе Animal
Console.WriteLine("Животное (0)",((Animal)animalArrayList[1]).Name);
Console.ReadLine(); }}}
В этом примере создается два семейства объектов, причем первое — с использованием класса System.Array (т. е. обыкновенный массив), а второе — с использованием класса System.ArrayList. Оба они являются семействами объектов класса Animal. Класс Animal является абстрактным классом, следовательно, создание экземпляров этого класса является недопустимым; однако за счет использования полиморфизма имеется возможность включить в состав семейства экземпляры класса Cow и класса Chicken, которые являются производными от класса Animal. Эти массивы создаются в методе Main(), после чего над ними производятся различные манипуляции, показывающие их характеристики и возможности.
Некоторые из продемонстрированных операций применимы как к семейству Array, так и к семейству ArrayList, хотя и имеются незначительные отличия в синтаксисе. Однако есть и такие операции, выполнение которых оказывается возможным только с более сложным типом ArrayList.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|