Объектно-ориентированное программирование» для студентов специальности 5В070300 «Информационные системы» идля оп 6В06120 «Информационные системы» Шымкент 2022



бет40/43
Дата28.03.2023
өлшемі1,44 Mb.
#76860
1   ...   35   36   37   38   39   40   41   42   43
Контрольные вопросы:
1. Опишите потоки ввода/вывода C#. Описать иерархию стандартных классов, представляющих потоки.
2. Опишите ввод и вывод данных, приведите примеры программного кода.
3. Опишите основные методы ввода-вывода в классах Cin, cout. Приведите примеры программного кода.
4. Опишите основные манипуляторы и флаги в потоках ввода-вывода.
5. Опишите механизм работы с файлами с использованием потоков ввода-вывода.


Лекция 29. Технологии.


Цель лекции: формирование у студентов умений демонстрировать свои представления о технологии
В результате освоения данной лекции студенты приобретают следующие способности:
атрибуты-определяют дополнительную информацию о классе;
спецификаторы-определяют условия доступа к компонентам класса;
Слово "Интерфейс" имеет много значений, может иметь разные значения в разных ситуациях. Существуют понятия программного и аппаратного интерфейса, но в большинстве случаев слово интерфейс определяет связь между объектами или процессами. В данной лекции будет рассмотрено понятие интерфейса (пишется после слова interface). Интерфейс-автономное состояние класса. Интерфейс полностью описывает абстрактный класс (в котором методы полностью абстрактны). Отличие интерфейса от абстрактного класса заключается в его синтаксисе и порядке выполнения. Разница в синтаксисе заключается в том, что интерфейсные методы объявляются без модификатора доступа.
Особенностью порядка исполнения является: строгость требований к потомству. Наследуемый класс интерфейса (interface Class) должен полностью выполнять все методы интерфейса. Все описанные выше различия отражают отличие абстрактного класса от наследуемого класса. Поколение (класс) абстрактного класса может выполнять некоторые методы абстрактного класса. Синтаксис интерфейса Формат записи общего описания интерфейса с необязательными элементами (они разделены квадратными скобками) имеет вид:
[атрибуты] [спецификации ] interface class_атегория [: родительский класс ] { класс_телос } ,
здесь,
атрибуты-определяют дополнительную информацию о классе;
спецификаторы-определяют условия доступа к компонентам класса;
родительский класс-наследуемые родительские интерфейсные классы нашего класса:
класс_-определяет состав интерфейсного класса.
Когда мы смотрим на формат подписки интерфейса, он похож на формат подписки простого класса. Потому что интерфейс является своего рода классом. Библиотека платформы .NET имеет множество типов интерфейсов, которые при наследовании класса приобретают дополнительные свойства. Использование стандартного интерфейса IEnumerable На первый взгляд кажется, что нет преимуществ внедрения класса интерфейса-методы кодирования, декодирования могут быть размещены непосредственно в классах MyzikText.
Классы в библиотеке платформы .NET имеют большое количество интерфейсных методов для каждого типа интерфейсов, которые наследуются классом и приобретают дополнительные свойства (не через реализацию методов, а через их имена). Обычно каждый класс интерфейса должен сам выполнять реализацию интерфейсных методов. Например, если класс должен организовать сканирование объектов, заданных в виде некоторого массива с помощью цикла foreach, то наш класс должен быть наследником интерфейса IEnumerable (перечисленный, перечислимый). Этот интерфейс имеет только один метод GetEnumerator (), и этот метод возвращает объект типа Enumerator (перечислитель, переслатель). Формат записи метода GetEnumerator() имеет следующий вид:
IEnumerator GetEnumerator();
Таким образом, этот класс должен быть преемником интерфейсов IEnumerable и Ienumerator. Интерфейс IEnumerator имеет одно свойство Object Current{get;} и два метода, которые возвращают указанный объект. Метод Bool MoveNext () перемещает каталог в следующий перечисленный объект, метод void Reset () устанавливает каталог в первый перечисленный объект. Организацию процесса сканирования объектов массива с помощью цикла Foreach позволяют описанное выше свойство и два метода. Эти интерфейсные методы работают с виртуальной коллекцией, поэтому они универсальны. Если в классе необходимо сопоставить объекты, например, отсортировать объекты, то такой класс следует объявить наследником интерфейса IComparable. Существует только один метод этого интерфейса-CompareTo (object obj), который возвращает целое число, положительное, отрицательное или нулевое, в зависимости от того, выполняется ли метод соотношением "большой", "маленький" или "равный".
Рассмотрим работу с интерфейсами IEnumerable и IEnumerator. По этому примеру необходимо организовать осмотр товаров в магазине. Класс Tovar имеет два поля-Название товара и его цена.
class Tovar
{
public string Naz; // название товара и цена
public int Cena;
public Tovar(string n, int c) // Конструкор
{
Naz = n; Cena = c;
}
}
Мы используем класс Cklad для хранения объектов типа Tovar, структура выглядит так:
class Cklad
{
public Tovar[] tovar; // Массивтоваров
public Cklad() // Конструкторсклада
{
tovar = new Tovar[4];
}
}
Максимальное количество объектов, которые можно хранить на складе, равно 4. Рассмотрим работу программы без интерфейса Ienumerable. Программа кода:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public static string s;
public static int kol;
class Tovar
{
public string Naz; // название товара и цена
public int Cena;
public Tovar(string n, int c) // Конструкор
{
Naz = n; Cena = c;
}
}
class Cklad
{
public Tovar[] tovar; // Массив по товару
public Cklad() // Конструктор склада
{
tovar = new Tovar[4];
}
}
public Form1()
{
InitializeComponent();
kol = 0;
s = "";
}
Cklad ckl = new Cklad();
private void button2_Click(object sender, EventArgs e)
{
if (kol < 4)
{
ckl.tovar[kol] = new Tovar(textBox1.Text, Convert.ToInt32(textBox2.Text));
s = s + textBox1.Text + textBox2.Text + "\r\n";
}
else { s = s + "склад заполнен" + "\r\n"; kol--; }
kol++;
textBox3.Text = s;
}
private void button1_Click(object sender, EventArgs e)
{
s = "";
s = "foreach работа цикла " + "\r\n";
foreach (Tovar t in ckl.tovar)
{
s = s + t.Naz + " " + t.Cena.ToString() + "\r\n";
}
s = s + "for работа цикла" + "\r\n";
for (int i = 0; i < kol; i++)
{
s = s + ckl.tovar[i].Naz + " " + ckl.tovar[i].Cena.ToString() + "\r\n";
}
textBox3.Text = s;
}
}
}
Работа программы представлена на рис. 25.2.



Рисунок 25.2-работа программы без интерфейсов


Стоит отметить, что в программе цикл foreach ckl.Tovar используется только для переменной типа массива, которая имеет встроенный интерфейс, и в ней определен метод GetEnumerator. Но, если мы используем цикл foreach для объектов класса Tovar, а не для массива Tovar объекта класса Cklad, например
foreach (Tovar t in ckl)
{
s = s + t.Naz + " " + t.Cena.ToString() + "\r\n";
} ,
там, в программе, выдает сообщение об ошибке: «foreach statement cannot operate on variables of type ' WindowsFormsApplication1.Form1.Cklad ' because 'Books' does not contain a public definition for 'GetEnumerator'» (Оператор foreach не может применяться к переменному типу ' WindowsFormsApplication1.Form1.Cklad ', так как переменные этого класса не содержат открытого определения метода 'GetEnumerator'). Добавим в программу нужный интерфейс, для этого нужно добавить в программу дополнительное пространство имен:
usingSystem.Collections;
Ckladкласы IEnumerable должен наследовать интерфейс:
class Cklad : IEnumerable
Cklad класының денесіне GetEnumerator добавить метод:
public IEnumerator GetEnumerator()
{
for (int i = 0; i < 4; i++) yield return tovar[i];
}
"Таким образом, если цикл foreach используется для рассмотрения элементов класса одновременно, то необходимо выполнить четыре метода GetEnumerator, Current, MoveNext, Reset « Например, если внутренние элементы класса организованы в виде массива, то необходимо будет описать замкнутое поле класса, где текущий индекс хранится в массиве. В методе MoveNext передача изменений этого индекса на 1 вместе с проверкой перехода массива через границу, в методе Current – возврат элемента массива с индексом в потоке и т.д. Это не интересная работа, но ее приходится выполнять довольно часто, поэтому в версии 2.0 в объект встроены инструменты – итераторы, облегчающие одновременное рассмотрение.
Итератор-это блок кода, в котором определяется последовательность сканирования элементов объекта по одному. На каждом шаге цикла Foreach выполняется один шаг итератора, в результате чего через служебное слово yield возвращается очередное значение. Чтобы выполнить сканирование по одному в версии 2.0-в классе необходимо указать, выполняется ли интерфейс IEnumerable, и описать итератор. Доступ к нему осуществляется с помощью методов MoveNext и Current интерфейса IEnumerator. на каждом шаге цикла foreach для итератора разрабатывается «забор» - служебный объект, в котором объект сохраняет текущее состояние итератора. Другими словами, составной код итератора не выполняется прерывистым образом, он разбит на отдельные итерации, а состояние итератора сохраняется между орарами. Два изменения, приведенные в программе, позволяют использовать цикл foreach.
Следует учитывать специфику работы цикла foreach, которая вызывает «зависание " программы. Если мы включаем режим сканирования товаров на складе после ввода нескольких объектов товара в нашей программе, но до полного заполнения массива, то программа «застревает» при выводе несуществующих значений, поэтому необходимо отслеживать значения в цикле foreach. Цикл For не имеет таких недостатков, поскольку конечное значение в нем определяется значением переменной Kol текущего диапазона.
for (int i = 0; i < kol; i++)
{
s = s + ckl.tovar[i].Naz + " " + ckl.tovar[i].Cena.ToString() + "\r\n";
}


Достарыңызбен бөлісу:
1   ...   35   36   37   38   39   40   41   42   43




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет