Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Написание кода






 

Для удобства описание будет разделено на 3 основные части:
1) Реализация интерфейса IEnumerator и IEnumerable

2) Реализация IComparer

3) Реализация ICloneable

IEnumerator и IEnumerable

Для циклического обращения к элементам коллекции зачастую проще (да и лучше) организовать цикл foreach, чем пользоваться непосредственно методами интерфейса IEnumerator. Тем не менее ясное представление о принципе действия подобных интерфейсов важно иметь по еще одной причине: если требуется создать класс, содержащий объекты, перечисляемые в цикле foreach, то в этом классе следует реализовать интерфейсы IEnumerator и IEnumerable. Иными словами, для того чтобы обратиться к объекту определяемого пользователем класса в цикле foreach, необходимо реализовать интерфейсы IEnumerator и IEnumerable в их обобщенной или необобщенной форме. Правда, сделать это будет нетрудно, поскольку оба интерфейса не очень велики.

Ниже приведен пример, в котором класс MyInt реализует данные интерфейсы:

Для начала мы создадим множество элементов, которые будем использовать:

int[] ints = {150};

int index = -1;

Здесь мы реализуем интерфейс IEnumerable:

public IEnumerator GetEnumerator()

{

return this;

}

Интерфейс IEnumerable (перечислимый) определяет всего один

Метод - GetEnumerator, возвращающий объект типа IEnumerator (перечислитель), который можно использовать для просмотра элементов объекта.

Потом реализуем интерфейс IEnumerator:

public bool MoveNext()

{

if (index == ints.Length - 1)

{

Reset();

return false;

}

 

index++;

return true;

}

 

public void Reset()

{

index = -1;

}

 

public object Current

{

get

{

return ints[index];

}

}

Интерфейс IEnumerator задает три элемента:

– свойство Current, возвращающее текущий элемент объекта;

– метод MoveNext, продвигающий перечислитель на следующий элемент объекта;

– метод Reset, устанавливающий перечислитель в начало просмотра.

И затем при помощи foreach выводим результат:

{

MyInt mi = new MyInt();

richTextBox1.Text = " Общее кол-во авто в магазине ";

foreach (int i in mi)

richTextBox1.Text += i.ToString();

richTextBox1.Text += " \n";

}

 

Реализация интерфейса IComparer

Для сортировки объектов определяемых пользователем классов зачастую проще всего реализовать в этих классах интерфейс IComparable. Тем не менее данную задачу можно решить и с помощью интерфейса IComparer. Для этой цели необходимо сначала создать класс, реализующий интерфейс IComparer, а затем указать объект этого класса, когда потребуется сравнение.

Для начала нам нужно создать методы доступа и переменные «Autoshop», где будут хранится характеристики автомобилей:

public string CarName { set; get; }

public int MaxSpeed { get; set; }

public double Cost { get; set; }

public byte Discount { get; set; }

public int ID { get; set; }

public AutoShop(string CarName, int MaxSpeed, double Cost, byte Discount, int ID)

{

this.CarName = CarName;

this.MaxSpeed = MaxSpeed;

this.Cost = Cost;

this.Discount = Discount;

this.ID = ID;

}

Дальше мы собственно реализуем этот интерфейс:

class CompInv< T>: IComparer< T>

where T: AutoShop

{

public int Compare(T x, T y)

{

if (x.Cost < y.Cost)

return -1;

if (x.Cost > y.Cost)

return 1;

else return 0;

}

В методе Compare сравниваются объекты х и у и возвращается нулевое значение, если значения сравниваемых объектов равны; положительное — если значение объекта х больше, чем у объекта у; и отрицательное — если значение объекта х меньше, чем у объекта у. И остается только вывод результатов работы алгоритма.

До сортировки:

foreach (AutoShop a in dic)

{

richTextBox2.Text += a.ToString();

richTextBox2.Text += " \n }

и после неё:

dic.Sort(cp);

foreach (AutoShop a in dic)

{

richTextBox3.Text += a.ToString();

richTextBox3.Text += " \n";

}

 

Реализация интерфейса ICloneable

Интерфейс ICloneable позволяет задать настраиваемую реализацию, создающую копию существующего объекта. Интерфейс ICloneable содержит один член — метод Clone, который предназначен для предоставления поддержки клонирования.

Создадим поверхностную копию:

public object Clone()

{

return MemberwiseClone();

}

Если необходимо скопировать в другую область памяти поля объекта, можно воспользоваться методом MemberwiseClone, который любой объект наследует от класса object. При этом объекты, на которые указывают поля объекта, в свою очередь являющиеся ссылками, не копируются. Это называется поверхностным клонированием.

 

Дальше создадим уже полностью независимый объект:

public object Clone()

{

return new EmployeeList(this.EmployeeListMembers)

}

Для создания полностью независимых объектов необходимо глубокое клонирование, когда в памяти создается дубликат всего дерева объектов, то есть объектов, на которые ссылаются поля объекта, поля полей, и так далее. Объект, имеющий собственные алгоритмы клонирования, должен объявляться как наследник интерфейса ICloneable и переопределять его единственный метод Clone.

Далее при выводе мы позволим пользователю изменить характеристики двигателей, чтобы наглядно увидеть что клон уже «живет сам по себе» то есть не изменяется вслед за тем объектом из которого его получили:

team.EmployeeListMembers[1].Name = textBox1.Text team.EmployeeListMembers[0].Title = textBox2.Text;







© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.