Пример использования композиции и коллекции класса
Понятие композиции и коллекции класса
Если некоторый класс, в своих полях данных, использует объекты другого класса, то такое объединение классов называется композицией.
Композиция классов это один из способов повторного использования ранее написанных фрагментов программ. Например, класс «аптека» можно рассматривать как композицию класса «лекарство» – массив различных объектов одного класса «лекарство». Примером композиции является объединение объектов «автомобиль» в классе «гараж» и т.д.
Эти примеры показывают, что композиции классов соответствует множество отношений из реальной жизни.
Объединение однотипных объектов в одной структуре данных называется коллекцией.
Коллекция должна обеспечивать многие функции обработки объектов - сохранять и удалять объекты, предоставлять операции доступа по обновлению и добавлению объектов и т.д.
Обычно коллекция представлена отдельным классом.
Класс, описывающий всю коллекцию, называется классом коллекции.
В приведенных примерах композиции классов второй класс часто выступает в роли коллекции объектов первого класса. Например, класс «гараж» представляет собой коллекцию объектов класса «автомобиль». Класс «аптека» – коллекцию объектов класса «лекарство».
Все классы коллекций условно можно разделить на линейные и нелинейные коллекции.
Линейные коллекции образуют следующие:
– с индексированным доступом, например, различные словари и справочники (телефонный справочник, в котором поиск выполняется по буквам фамилии абонента);
– с прямым доступом, например, массивы. Многие «списки» представлены динамическими массивами;
– с последовательным доступом, например, стеки, очереди, списки.
Нелинейные коллекции включают следующие:
– иерархические, например, различные древовидные структуры. Иерархические системы классификации - УДК или организация поисковых массивов документов в некоторых поисковых системах;
– групповые, например, различные наборы, сетевые структуры, графы.
Еще раз отметим, что композиция классов является мощным инструментом программирования при использовании ранее разработанных классов или даже фрагментов программ.
В среде программирования C# существует множество различных классов, предназначенных для коллекционирования однотипных объектов других классов, например, различные списки, стеки, очереди, словари, деревья и многие другие коллекции.
Пример использования композиции и коллекции класса
Из всего разнообразия классов коллекций рассмотрим самую простую коллекцию классов – массив.
Задача 12.1 Пусть элементом массива является объект класса КНИГА. Для простоты будем считать, что все данные класса открыты и ограничены только автором книги, ее названием и ценой. Из методов класса используем только конструктор с заданием параметров.
В программе предусмотреть запись массива объектов в файл и чтение из файла данных в массив объектов с помощью сериализации и десериализации объектов.
Исходный код программы:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[Serializable]
public class Kniga
{
public string Naz;
public string Avtor;
public int Ctoimoct;
public Kniga(string sa, string sb, int sc)
{
Avtor = sa; Naz = sb; Ctoimoct = sc;
}
};
public static Kniga[] Polka= new Kniga[20];
public static int kol=0;
public string ss = "";
private void button1_Click(object sender, EventArgs e)
{
string a, b;
int c;
a = textBox1.Text;
b = textBox2.Text;
c = Convert.ToInt32(textBox3.Text);
Kniga Tom = new Kniga(a, b, c);
Polka[kol] = Tom;
kol++;
}
private void button2_Click(object sender, EventArgs e)
{
textBox4.Text = "";
for(int i=0;i<kol;i++)
{
ss = Polka[i].Avtor + " " + Polka[i].Naz + " " +
Convert.ToString(Polka[i].Ctoimoct) + "\r\n";
textBox4.AppendText(ss);
}
}
private void button3_Click(object sender, EventArgs e)
{
// Создаем поток для сериализации:
FileStream StreamOut = new FileStream("knigi.dat", FileMode.Create, FileAccess.Write);
// Используем двоичный формат:
BinaryFormatter fmt = new BinaryFormatter();
for (int i = 0; i < kol; ++i)
{
fmt.Serialize(StreamOut, Polka[i]); // Сериализуем объекты
}
StreamOut.Close(); // Закрываем поток
}
private void button4_Click(object sender, EventArgs e)
{
textBox4.Text = "Вывод после чтения из файла: \r\n";
// Создаем поток для десериализации:
FileStream StreamIn = new FileStream("knigi.dat",
FileMode.Open, FileAccess.Read);
// Используем двоичный формат:
BinaryFormatter fmt = new BinaryFormatter();
kol = 0;
bool ok = true;
int i = 0;
while (ok)
{
try
{
Polka[i] = (Kniga)fmt.Deserialize(StreamIn);//Десериализуем
kol++; i++; textBox4.AppendText(kol.ToString() + "\r\n");
}
catch
{
MessageBox.Show("Failed to deserialize");
break;
}
}
StreamIn.Close(); // Закрываем поток
textBox4.AppendText(kol.ToString() + "\r\n");
}
}
}
Работа программы:
Рисунок 12.1 – Работа программы
Необходимо отметить, что в языке C# имеется несколько классов, реализующих коллекцию объектов, например, массива, стеки и очереди и т.д. Считается, что только массивы являются конструкцией языка C#, а остальные коллекции – это просто классы платформы .NET (точнее ее библиотеки Framework). Поэтому, имеет смысл, ознакомится с составом коллекций этой библиотеки.
Дата добавления: 2018-11-25; просмотров: 822;