maran program engineering (830029), страница 18
Текст из файла (страница 18)
Также это упрощаетповторное использование реализованных алгоритмов.Разделение алгоритмов и интерфейса можно выполнить на трех уровнях:• В состав стандартного класса, реализующего интерфейс, добавим своифункции, реализующие алгоритм.96• В эту область имен добавим собственные классы. Имейте в виду: собственные классы должны располагаться ПОСЛЕ стандартных.• Создание отдельных библиотек классов, которые будут подключены.Рассмотрим здесь использование дополнительного класса в существующем проекте. Третий подход рассмотрим в следующем параграфе.
Дополнительный класс может быть создан «с нуля» в самом проекте или можно подключить к проекту ранее созданный класс. Рассмотрим второй подход и подключим к проекту, рассмотренному в п. 5.4.4, класс MyClass, созданный нами вп. 4.8. Для этого поставим курсор мыши на имя проекта и из контекстного меню выберем по очереди Добавить — Существующий элемент. После этого найдем проект, при выполнении которого требуемый класс был сгенерирован(в нашем случае Mod48), сгенерированные классы находятся там в папкеMod48Lib, а в этой папке имеется папка GeneratedCode, где мы и найдем требуемый класс и подключим его к проекту. Приведем текст добавленного класса.
Часть класса, которая не используется в данном примере, закомментированаи здесь не приводится. Оставим только функцию суммирования одномерногомассива.public class MyClass : ClassX{public double [] mas;public MyClass(double[] mas){this.mas = new double[mas.Length];for (int i = 0; i < mas.Length; i++)this.mas[i] = mas[i];}/*Пропущенная часть*/public double Sum12(){return mas.Sum();}}Интерфейс приложения был представлен на рис. 5.3.
В п. 5.4.4 осталасьнереализованной кнопка «Класс», реализация которой приведена ниже. С помощью прикрепленного класса находим сумму строки, номер которого задан.private void СlCl2_Click(object sender, EventArgs e){int kol;double[] arr;double z;MyClass my;97//объявим переменную типа класс MyClasskol = Convert.ToInt32(NumRow.Text);if (kol < 0 || kol > n - 1) kol = 0;//проверим, находится ли номер строки//в допустимых пределахarr = new double[dataGridView1.Columns.Count];//создаем массив для размещения строки исходногоfor (int i = 0; i < arr.Length; i++)arr[i] = Convert.ToDouble(dataGridView1.Rows[kol].Cells[i].Value);//заполняем массив элементами заданной строкиmy = newMyClass(arr);//запускаем конструктор классаz = my.Sum12();Cl1.Text = z.ToString("F3");}5.4.
Работа с библиотекой классовРассмотрим создание отдельной библиотеки классов, которую можноподключить к любому проекту. Для этого создадим проект, который так и называется «Библиотека классов». Эту библиотеку можно создать «с нуля» илипутем добавления туда заранее сгенерированных классов из проекта моделирования. Выберем первый путь (подключение сгенерированных классов былорассмотрено в предыдущем параграфе) и создадим библиотеку ClassLibrary1.При создании библиотеки классов надо соблюдать следующие требования:• Классы, которые должны быть доступны за пределами создаваемой библиотеки, должны иметь атрибут доступа public.• Для обеспечения универсальности создаваемой библиотеки желательноисходные данные передавать в функции через параметры, а результатыих работы получать тоже через параметры или в виде возвращаемых значений.
Желательно избегать использование средств консольного вводо/вывода и обращения к формам (хотя это НЕ запрещено).Пусть у нас имеется следующая библиотека:namespace ClassLibrary1{/// <summary>/// Это базовый класс/// </summary>public class Class1{protected double[] mas;/// <summary>/// Конструктор/// </summary>/// <param name="mas">Исходный массив</param>98public Class1 (double []mas){this.mas=new double [mas.Length];mas.CopyTo(this.mas,0);}/// <summary>/// Это свойство - количество положительных элементов/// </summary>public int KolPol{get {return mas.Where(p => p > 0).Count();}}public int KolNeg{get {return mas.Where(p => p < 0).Count();}}}/// <summary>/// Это класс-наследник/// </summary>public class Class2:Class1{protected double c1, c2;double sum = -10000;/// <summary>/// </summary>/// <param name="temp"></param>public Class2(double []temp):base(temp){}/// <summary>/// Ввод данных в класс/// </summary>/// <param name="c1">Нижняя граница</param>/// <param name="c2">/// Верхняя граница/// </param>public void inpt(double c1,double c2){this.c1 = c1; this.c2 = c2;}/// <summary>99/// Функция с возвращаемым значением/// </summary>/// <returns>Сформированный массив</returns>public double [] NewMas(){return mas.Where(p => p > c1 && p < c2).ToArray();}/// <summary>/// Функция без возвращаемого значения/// </summary>/// <param name="d1">Граница</param>/// <param name="cnt">/// Результат/// </param>public void fun1(double d1,out int cnt){cnt = 0;foreach (double x in mas)if (x > d1) cnt++;}}}Структура классов и их функций предельно проста и не нуждается вразъяснениях.
Желательно включить в библиотеку классов XML-комментарии,что сильно облегчает использование библиотеки в будущем (XML — eXtensibleMarkup Language — расширенный язык разметки). Напомним: признаком XMLкомментария в C# является ///. В библиотеке классов XML-комментарии целесообразно ставить перед классами и перед функциями (конструктор тожефункция). В таком случае будет автоматически создан каркас комментария:summary для общей характеристики класса или функции, param для каждогоформального параметра при их наличии, returns для возвращаемого значенияпри его наличии. Остается лишь писать необходимый текст, при этом недопустимо нарушить структуру комментария: любой текст должен быть между знаками, например <summary> .
. . </summary> , нарушение этого правила считается синтаксической ошибкой.Для завершения создания библиотеки:• Поставим курсор мыши на имя созданной библиотеки (ClassLibrary1) ивыберем из контекстного меню пункт «Свойства», в открывающемся окнесвойств пункт «Сборка (Build)». В нижней его части можно определитьпапку размещения создаваемой библиотеки (по умолчанию bin\debug впапке проекта).• Ставим «галочку» при XML.• После этого из меню Visual Studio выберем Сборка — Построить (Build —Build Solution) ClassLibrary1.
Если в библиотеке были допущены синтаксические ошибки, то появятся диагностика, если их нет — библиотекабудет создана в виде файла с расширением *.dll.100Powered by TCPDF (www.tcpdf.org)Использование созданной библиотеки. Для простоты создадим консольноеприложение useClassLibr1. Для подключения созданной библиотеки в обозревателе решения найдем пункт References и из его контекстного меню выберемдобавление ссылки.
Откроется диалоговое окно, с помощью кнопки Обзор найдем нужную папку (если все было сделано правильно, то там должен быть файлClassLibrary1.dll) и добавим ссылку. Чтобы освободиться от необходимости писать при обращении к компонентам библиотеки полные имена, можно добавитьusing ClassLibrary1;После этого можем работать с классами из библиотеки точно так, как работаемс классами, созданными в текущем проекте:static void Main(string[] args){double[] mas,res;int n,mpol,motr,k;Class2 my;// ввод masmy = new Class2(mas);mpol = my.KolPol;k=my.fun1()my.inpt(1, 5);my.fun1(2.3, out k);//и т.д.}5.5. Реализация взаимодействия с базой данных5.5.1. Структура базы данныхПрактически во всех задачах необходимы условно-постоянные данные,которые используются многократно и которые должны храниться в базе данных.
Рассмотрим в этом пункте использование баз данных в программах на C#в Microsoft Visual Studio. Пусть база данных создана с использованием системыуправления базами данных Microsoft SQL Server. Созданию баз данных посвящена обширная литература, поэтому мы не будем на этом останавливаться.Пусть наша база данных состоит из двух таблиц.Groups — учебные группы (номер группы — ключ и специальность).Students — данные о студентах (табельный номер — ключ, фамилия, имя,группа, рост, вес, дата рождения). Автор, конечно, отдает себе отчет о том, чторост и вес неважные показатели, но нужны простые числовые данные! Типы101данных видны из рисунка. Между таблицами установлена связь по полямGrNum и Gr с включением режима защиты ссылочной целостности: ни одинстудент не может учиться в несуществующей группе.
Напомним, что в базахданных не допускается повторение значений в ключевом поле. Кроме того, существует представление FamSpec, созданное на основе двух таблиц и содержащее поля фамилия, имя, специальность. В программах на C# представления могут быть обработаны аналогично таблицам, за исключением внесения изменений в данные. Кроме того, в базе данных имеются хранимые процедуры ифункции. Рассмотрим создание приложения «клиент — сервер», где данные,хранимые процедуры и функции хранятся и выполняются на сервере. Клиентдолжен осуществлять их вызов и пользоваться результатами, возможно, с дальнейшей обработкой.Хранимые процедуры и функции написаны на языке T-SQL, ограничимсяпростейшими средствами этого языка (-- это комментарии на T-SQL).Хранимые процедуры. Извлечение данных.CREATE PROCEDURE dbo.CountStudents(@par1 int = 150,-- входной параметр со значением по умолчанию@par2 int OUTPUT ) -- результат процедурыASSET @par2=( --найти количество студентов,-- ростом выше заданногоSelect COUNT(*)From StudentsWhere Rost>@par1)RETURN )Удаление данных.