Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пакет практичних робіт.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.04 Mб
Скачать

Пример на перегрузку унарного оператора

using System;

class SomeClass

{

int i;

public SomeClass(int value)

{

i = value;

}

public static int operator - (SomeClass s)

{

return -s.i;

}

}

class Test

{

static void Main()

{

SomeClass sc = new SomeClass(10);

Console.WriteLine(-sc);

}

}

Пример на перегрузку true и false

using System;

class SomeClass

{

int i;

public SomeClass(int value)

{

i = value;

}

public override string ToString()

{

return i.ToString();

}

public static bool operator true(SomeClass s)

{

return s.i != 0;

}

public static bool operator false(SomeClass s)

{

return s.i == 0;

}

}

class Test

{

static void Main()

{

SomeClass sc = new SomeClass(10);

if(sc)

Console.WriteLine("yes");

else

Console.WriteLine("no");

}

}

Пример на перегрузку бинарного оператора

using System;

class SomeClass

{

int i;

public SomeClass(int value)

{

i = value;

}

public override string ToString()

{

return i.ToString();

}

public static SomeClass operator + (SomeClass s, int ii)

{

s.i += ii;

return s;

}

}

class Test

{

static void Main()

{

SomeClass sc = new SomeClass(10);

Console.WriteLine(sc + 3);

sc += 2;

Console.WriteLine(sc);

}

}

Пример на перегрузку явных и неявных преобразований

using System;

class SomeClass

{

int i;

public SomeClass(int value)

{

i = value;

}

public override string ToString()

{

return i.ToString();

}

// Неявное преобразование из SomeClass в int

public static implicit operator int(SomeClass s)

{

return s.i;

}

// Явное преобразование из int в SomeClass

public static explicit operator SomeClass(int ii)

{

SomeClass s = new SomeClass(ii);

return s;

}

}

class Test

{

static void Main()

{

SomeClass sc = new SomeClass(10);

// Неявное преобразование

int i = sc;

Console.WriteLine(i);

// Явное преобразование

sc = (SomeClass)100;

Console.WriteLine(sc);

}

}

Практична робота 4. Моделювання в конструюванні. Створення та використання класу ArrayList для розроблених типів. Частина 1. Частина 1.Створення власної колекції.

Мета - вивчення інтерфейсів, необхідних для створення власної колекції.

Завдання. Створити власний клас - колекцію.

Теоретична частина

Чтобы корректно взаимодействовать с другим компонентами, все коллекции в .NET должны реализовать подмножество специальных интерфейсов.

В табл. приведены краткие описания важнейших интерфейсов, имеющих отношение к коллекциям.

Таблица

Интерфейс

Описание

Методы

ICollection<T>

Основные методы, имеющие отношение к большинству типов коллекций. Наследует от интерфейса IEnumerable<T>

Add, Clear, Contains, СоруТо, Remove

IEnumerable<T>

Указывает, что объекты коллекции можно перебрать с помощью конструкции foreach

GetEnumerator

IDictionary<Tkey,TValue>

Позволяет осуществлять доступ к элементам коллекции через пары "ключ/значение". Наследует от интерфейса icollec- tion<KeyValuePair<TKey, TValue»

ContainsKey, TryGetValue

IList<T>

Указывает, что к элементам коллекции можно обращаться по индексу. Наследует от интерфейса ICollection<T>

IndexOf, Insert, RemoveAt

/* класс Tovar, создать перегрузку знака >(больше), метод ToString.

класс Shop, в нем использовать поля из класса Tovar, так же сделать ToString, написать свойства.

Реализовать сортироаку по стоимости, написать сериализацию, создать событие, индексацию */

using System;

using System.Collections;

using System.Collections.Generic;

using System.Runtime.Serialization.Formatters.Binary;

using System.Runtime.Serialization;

using System.IO;

namespace CLASS

{

[Serializable]

public class Tovar : ICloneable, IComparable

{

public static event EventHandler MyEvent;

public string name;

public int count;

public Tovar(string _name, int _count)

{

name = _name;

count = _count;

}

public Tovar() : this("", 0) { }

public string Name

{

get { return name; }

set { name = value; }

}

public int Count

{

get { return count; }

set

{

if (value > count && MyEvent != null)

MyEvent(this, EventArgs.Empty);

}

}

public virtual string Byu()

{

return string.Format("Оджеду одели! ");

}

public override string ToString()

{

return "\nНаименование: " + name + " Код продукта: " + count.ToString();

}

public object Clone() // реализация интерфейса ICloneable

{

Tovar ob = new Tovar();

ob.count = this.count;

ob.name = this.name;

return ob;

}

// Реализция интерфейса IComparable для сортировки по count

public int CompareTo(object o)

{

Tovar temp = (Tovar)o;

if (this.count > temp.count)

return 1;

if (this.count < temp.count)

return -1;

else

return 0;

}

// Допоміжний клас для сортування по полю класу name

public class SortByName : IComparer

{

public int Compare(object o1, object o2)

{

Tovar t1 = (Tovar)o1;

Tovar t2 = (Tovar)o2;

return String.Compare(t1.Name, t2.Name);

}

}

public static IComparer sortByName

{

get

{

return (IComparer)new SortByName();

}

}

// Пример на перегрузку бинарного оператора +

public static Tovar operator +(Tovar s, int a)

{

Tovar temp = (Tovar)s.Clone();

temp.Count += a;

return temp;

}

// Пример на перегрузку унарного оператора -

public static Tovar operator -(Tovar o)

{

Tovar tmp = (Tovar)o.Clone(); //Переобразовывает из object в Tovar

tmp.Count -= 10;

return tmp;

}

// Перегрузка операторов true, false

public static bool operator true(Tovar A)

{

//Если хоть что то не равно нулю, значит выражение истинно

if (A.Count != 0)

return true;

else

return false;

}

public static bool operator false(Tovar A)

{

//Если все равно нулю, значит выражение истинно

if (A.Count == 0)

return true;

else

return false;

}

public static bool operator !=(Tovar A, Tovar B)

{

return A.Name != B.Name;

}

public static bool operator ==(Tovar A, Tovar B)

{

return A.Name == B.Name;

}

public static bool operator >(Tovar A, Tovar B)

{

if (A.count > B.count)

return true;

else

return false;

}

public static bool operator <(Tovar A, Tovar B)

{

if (A.count < B.count)

return true;

else

return false;

}

public class EmptyStringException : Exception // Класс ислючения, который обязательно наследованный от стандартного класса Exception

{

public override string Message

{

get

{

return "Пустая строка! ";

}

}

}

}

[Serializable]

public class Shop

{

public Shop()

{

array = new Tovar[0];

}

Tovar[] array = null; //массив объектов базового типа

int pos = -1;

public int Length

{

get { return array.Length; }

}

public void Add(Tovar _obj) //добавление нового элемента в конец массива

{

int i, n;

if (array != null)

{

Tovar[] tmp = new Tovar[array.Length + 1];

array.CopyTo(tmp, 0);

tmp[tmp.Length - 1] = _obj;

array = tmp;

}

else

{

array = new Tovar[1];

array[0] = _obj;

}

}

public void SortToCount()

{

Array.Sort(array);

}

public void SortToName()

{

Array.Sort(array, Tovar.sortByName);

}

public override string ToString() //переопределенный метод ToString

{

string s = String.Empty;

for (int i = 0; i < array.Length; i++)

{

s += array[i].ToString() + " ";

}

return string.Format(s);

}

public Tovar this[int i] // индексатор числовой

{

get

{

return this.array[i];

}

set

{

array[i] = value;

}

}

public bool this[string n]

{

get

{

for (int i = 0; i < array.Length; i++)

if (array[i].Name == n)

return true;

return false;

}

}

}

[Serializable]

public class Program

{

public static void OnEventCount(object ob, EventArgs e)

{

Console.WriteLine("Сount увеличилась");

}

static void Main(string[] args)

{

Tovar.MyEvent += new EventHandler(OnEventCount);

Tovar obj = new Tovar("Cup", 3056);

Tovar T = new Tovar("Bow", 1012);

Shop S = new Shop();

T.Count = 6620; // для события

S.Add(obj);

S.Add(T);

Console.WriteLine(S.ToString());

// Сортировка

S.SortToCount(); //сортировка по count

S.SortToName(); // сортировка по имени

// ICloneable: глубокое копирование

Tovar T1 = new Tovar("Rave", 3156);

Tovar T2 = (Tovar)T1.Clone();

T2.count = 10;

Console.WriteLine("\nПервый объект " + T1);

Console.WriteLine("Второй объект " + T2);

//Сериализация и десериализация

FileStream fs = File.Create("Tovar.txt");

BinaryFormatter bf = new BinaryFormatter();

bf.Serialize(fs, S);

fs.Close();

fs = File.OpenRead("Tovar.txt");

bf = new BinaryFormatter();

S = (Shop)bf.Deserialize(fs);

fs.Close();

Console.ReadKey();

}

}

}