СТРОГО ФИКСИРОВАННОЕ КОЛИЧЕСТВО ЭЛЕМЕНТОВ!

Пример использования семейства 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.