
- •Практична робота. Середовище розробки додаткив с#. Базові класи. Клас String.
- •Методи классу String для робот из рядками
- •Варіанти індивідуальних завдань
- •Контрольні питання
- •Практична робота 1. Проектування. Класи. Конструктори класу. Статичниі елементів класу. Спадкоємство. Частина 1.Класи. Конструктори класу. Статичні елементи класу.
- •Теоретична частина
- •Приклад
- •Хід виконання роботи
- •Індивідуальні завдання
- •Контольні запитання
- •Частина 2. Спадкоємство.
- •Теоретична частина
- •Приклад класичного спадкоємства
- •Приклад спадкоємства включення - делегування
- •Контрольні питання
- •Практична робота 2. Використання системних інтерфейсів. Створення класів походних від стандартних інтерфейсів. Частина 1. Інтерфейс iCloneable.
- •Теоретична частина
- •Приклад
- •Контрольні питання
- •Частина 2. Інтерфейси iСomparable і iСomparer.
- •Теоретична частина
- •Приклад
- •Контрольні питання
- •Частина 3. Інтерфейси iEnumerable і iEnumerator.
- •Теоретична частина
- •Інтерфейс iEnumerable
- •Приклад
- •Реалізація класу -коллекция без реалізації інтерфейсу Iеnumerator
- •Контрольні питання
- •Практическая работа 3. Моделювання в конструюванні. Використання масивів для розроблених типів. Частина 1. Користувальницький індексатор.
- •Теоретическая часть
- •Отличия между свойствами и индексаторами
- •Интерфейсы и индексаторы
- •Частина 2. Перевантаження унарних та бінарних операцій.
- •Теоретическая часть
- •Пример на перегрузку унарного оператора
- •Пример на перегрузку true и false
- •Пример на перегрузку бинарного оператора
- •Пример на перегрузку явных и неявных преобразований
- •Практична робота 4. Моделювання в конструюванні. Створення та використання класу ArrayList для розроблених типів. Частина 1. Частина 1.Створення власної колекції.
- •Теоретична частина
Пример на перегрузку унарного оператора
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();
}
}
}