42721

Интерфейсы, делегаты, события

Лабораторная работа

Информатика, кибернетика и программирование

Таблица 1 Список используемых элементов управления Элемент управления Класс Описание textBox1 TextBox Окно ввода имени продавца textBox2 TextBox Окно ввода фамилии продавца textBox3 TextBox Окно ввода стажа продавца textBox4 TextBox Окно вывода списка продавцов textBox5 TextBox Окно ввода оклада продавца textBox6 TextBox Окно ввода имени менеджера textBox7 TextBox Окно ввода фамилии менеджера textBox8 TextBox Окно ввода стажа менеджера textBox9 TextBox Окно ввода оклада менеджера textBox10 TextBox Окно вывода зарплаты менеджера button1 Button...

Русский

2013-10-30

277.5 KB

68 чел.

ЛАБОРАТОРНАЯ РАБОТА № 6

Интерфейсы, делегаты, события

Цель работы:. 

  1.  Познакомиться с расширенными возможностями языка программирования C#, такими, как интерфейсы и делегаты.
  2.  Познакомиться с механизмами событийно-ориентированного программирования на языке C#, такими как механизм обработки событий и исключительные ситуации

1 Теоретическое введение

1.1 Интерфейсы

В C# для полного отделения структуры класса от его реализации используется механизм интерфейсов. Интерфейс является расширением идеи абстрактных классов и методов.

Синтаксис интерфейсов подобен синтаксису абстрактных классов. Объявление интерфейсов выполняется с помощью ключевого слова interface. При этом методы в интерфейсе не поддерживают реализацию. Членами интерфейса могут быть методы, свойства, индексаторы и события.

Интерфейс может реализовываться произвольным количеством  классов. Один класс, в свою очередь, может реализовывать любое число интерфейсов. Каждый класс, включающий интерфейс, должен реализовывать его методы. В интерфейсе для методов неявным образом задается тип public.  В этом случае также не допускается явный спецификатор доступа.

Синтаксис:

[атрибуты] [модификаторы] interface Имя_интерфейса[:список_родительских_интерфейсов] {

обьявление_свойств_и_методов}

Пример:

class Animal

{

public string Name;

private int Weight;

protected int Type;

public int Animal(int W, int T, string N)

{

 Weight=W;

 Type=T;

 Name=N;

   }

   public int GetWeight(){return Weight;}

}

interface Species

 {

string Species();

void Feed();

 }

class Cheetah:Animal,Species

 {

private string ScientificName;

public string Species()

{

return ScientificName;

}

public void Feed()

{Weight++;}

 }

Можно объявлять ссылочную переменную, имеющую интерфейсный

тип. Подобная переменная может ссылаться на любой объект, который реализует ее интерфейс. При вызове метода объекта с помощью интерфейсной ссылки вызывается версия метода, реализуемого данным объектом.

Возможно наследование интерфейсов. В этом случае используется синтаксис, аналогичный наследованию классов. Если класс реализует интерфейс, который наследует другой интерфейс, должна обеспечиваться реализация для всех членов, определенных в составе цепи наследования интерфейсов.

1.2 Делегаты

Делегат — это объект, имеющий ссылку на метод. Делегат позволяет выбрать вызываемый метод во время выполнения программы. Фактически значение делегата – это адрес области памяти, где находится точка входа метода.

Важным свойством делегата является то, что он позволяет указать в коде программы вызов метода, но фактически вызываемый метод определяется во время работы программы, а не во время компилирования.

Делегат объявляется с помощью ключевого слова delegate, за которым

указывается тип возвращаемого значения, имя делегата и список параметров

вызываемых методов.

Синтаксис:

delegate тип_возвращаемого_значения имя_делегата (список_параметров);

Xарактерной особенностью делегата является возможность его использования для вызова любого метода, который соответствует подписи делегата. Это дает возможность определить во время выполнения программы, какой из методов должен быть вызван. Вызываемый метод может быть методом экземпляра, ассоциированным с объектом, либо статическим методом, ассоциированным с классом.

Метод можно вызвать только тогда, когда его подпись соответствует  подписи делегата.

1.2.1 Многоадресность делегатов

Многоадресность — это способность делегата хранить несколько ссылок на различные методы, что позволяет при вызове делегата инициировать эту цепочку методов.

Для создания цепочки методов необходимо создать экземпляр делегата,

и пользуясь операторами + или += добавлять методы к цепочке. Для удаления метода из цепочки используется оператор - или -=. Делегаты, хранящие несколько ссылок, должны иметь тип возвращаемого значения void.

1.3 События

Событие — это автоматическое извещение о каком-либо  роизошедшем

действии. События являются членами класса и объявляются с использованием ключевого слова event. Механизм событий основан на использовании делегатов.

Синтаксис:   event имя_делегата имя_обьекта;

1.3.1 Широковещательные события

События могут активизировать несколько обработчиков, в том числе те, что определены в других объектах. Такие события называются широковещательными. Широковещательные события создаются на основе многоадресных делегатов.

Пример:

// Объявление делегата, на основе которого будет  определено событие.

delegate void MyEventHandler () ;

// Объявление класса, в котором инициируется событие.

class MyEvent

{

public event MyEventHandler activate;

// В этом методе инициируется событие.

public void fire()

{ if (activate != null) activate();

}

class X

{

public void Xhandler()

{

Console.WriteLine("Событие получено объектом класса X.");

}

}

class Y

{

public void Yhandler()

{

Console.WriteLine("Событие получено объектом

класса Y.");

}

}

class EventDemo

{

 static void handler()

 {

   Console.WriteLine("Событие получено объектом

класса EventDemo.")

 }

 public static void Main()

 {

   MyEvent evt = new MyEvent();

   X xOb = new X();

   Y yOb = new Y();

   // Добавление методов handler (), Xhandler()

   // и Yhandler() в цепочку обработчиков события.

   evt.activate += new MyEventHandler(handler);

evt.activate += new MyEventHandler(xOb.Xhandler);

   evt.activate += new MyEventHandler(yOb.Yhandler);

   evt.fire();

   Console.WriteLine();

   evt.activate -= new MyEventHandler(xOb.Xhandler);

   evt.fire();

 }

}

2 Пример приложения для работы с интерфейсами, делегатами и событиями

В качестве примера рассмотрим объектно-ориентированное приложение – «Отдел магазина». Приложение включает следующие пользовательские классы:

  •  Класс человек «Person» - включает следующие свойства – Имя (Name), Фамилию (Fio) и оклад (Salary);
  •  Класс продавец «Assistant» - наследник класса «Person», содержит все свойства родительского класса, а также и дополнительные свойства Стаж (Seniority)  и Зарплата (Salarysum).  Зарплата рассчитывается как  оклад плюс стаж умноженный на 2% (Salarysum =Salary+ Seniority*0.2);
  •  Класс менеджер (зав.отделом, управляющий) «Manager» - наследник класса «Assistant», содержит все свойства родительского класса и дополнительное свойство Количество подчиненных (Subordinate). Зарплата у менеджера  рассчитывается как  оклад плюс стаж умноженный на 2%  плюс количество подчиненных умноженное на 2% (Salarysum =Salary+ Seniority*0.2+ Subordinate*0.2) .

Кроме того, приложение содержит интерфейсный класс ISalSum, в котором объявлен метод – Расчет зарплаты (CalcSalSum). Реализация данного метода приведена  в классах Assistant и Manager. Данные классы являются наследниками интерфейсного класса  ISalSum.

Диаграмма классов разработанного приложения приведена на рисунке 1.

Так как при изменении количества продавцов зарплата менеджера изменяется и данное изменение отображается в окне формы, выполняются следующие действия:

  1.  В классе продавец (Assistant) создается событие «Добавление продавца» (AddAssistant). Данное событие возникает при создании нового экземпляра класса продавец (Assistant). Другими словами, класс Assistant является издателем события;
  2.  Для реализации механизма обработки события  используется стандартный делегат из библиотеки .NETEventHandler;
  3.  Обработка события выполняется в классах – получателях события (класс Manager и класс Form1). Для этого в них описываются   методы-обработчики событий, сигнатура которых соответствует типу делегата. В классе Manager – это метод DoEvent, а в классе Form1 – это метод ViewEvent. Таким образом, классы Manager и Form1 являются подписчиками;
  4.  Каждый объект (не класс), желающий получать сообщение  должен зарегистрировать в объекте- издателе  этот метод.


Экранная форма разработанного приложения приведена на рисунке 2.


Список используемых элементов управления приведен в таблице 1.

Таблица 1 Список используемых элементов управления

Элемент управления

Класс

Описание

textBox1

TextBox

Окно ввода имени продавца

textBox2

TextBox

Окно ввода фамилии продавца

textBox3

TextBox

Окно ввода стажа продавца

textBox4

TextBox

Окно вывода списка продавцов

textBox5

TextBox

Окно ввода оклада продавца

textBox6

TextBox

Окно ввода имени менеджера

textBox7

TextBox

Окно ввода фамилии менеджера

textBox8

TextBox

Окно ввода стажа менеджера

textBox9

TextBox

Окно ввода оклада менеджера

textBox10

TextBox

Окно вывода зарплаты менеджера

button1

Button

Командная кнопка «Создать продавца» (экземпляр класса «Продавец»)

button2

Button

Командная кнопка «Создать менеджера» (экземпляр класса «Менеджер»)

button3

Button

Командная кнопка «Обновить список продавцов»

Последовательность действий по программированию приложения:

  1.  Создайте приложение,  окно которого изображенное на рисунке 1.
  2.  Создайте класс Person. Каждый класс будет храниться в отдельном файле, для это щелкните правой кнопкой мыши по имени проекта (как показано на рисунке 3). В появившемся контекстном меню выберите пункты AddNew Item. В появившемся окне в списке Templates выберите пункт Class и в поле Name введите имя Person.cs  (см. рисунок 4). В C# принято давать имена файлам по имена класса, который. В нем хранится.

  1.  Класс Person  будет иметь вид:

class Person

   {

       protected string name;

       public string Name

       {

           get { return name; }

           set { name = value; }

       }

       protected string fio;

       public string Fio

       {

           get { return fio; }

           set { fio = value; }

       }

       protected int salary;

       public int Salary

       {

           get { return salary; }

           set { salary = value; }

       }

   }

Где переменные name (имя), fio(фамилия) и salary (оклад) – поля, а Name, Fio и Salary – свойства. В Visual Studio, чтобы превратить переменную в свойство, нужно выделить переменную и в появившемся контекстном меню последовательно выбрать пункты: Refactor Encapsulated Fiels (Улучшение Инкапсулировать поле). В ответ появится окно, в котором нужно ввести имя будущего свойства. Свойства желательно именовать  так же как и переменные, но только с большой буквы.

  1.  Создание класса  Assisstant (Продавец). Класс также помещается в отдельный файл Assisstants. Класс Assisstant имеет вид:

// На интерфейс ISalSum пока не обращаем внимания

// (его можно пока не указывать)

class Assistant:Person, ISalSum

   {

       protected int seniority;

 // На данную строку пока не обращаем внимания

     //(ее можно пока пропустить)

       public event EventHandler AddAssistant;

       

       public int Seniority

       {

           get { return seniority; }

           set { seniority = value; }

       }

       protected double salarysum;

       public double Salarysum

       {

           get { return salarysum; }

           set { salarysum = value; }

       }

// На данную функцию пока не обращаем внимания

// (ее можно пока пропустить)

       double ISalSum.CalcSalSum()

       {

           salarysum = this.Salary + seniority * 0.2;

           if (AddAssistant != null) AddAssistant(this,null);

           return salarysum;

       }

   }

Как видно из листинга, класс Assistant является дочерним классом класса Person и содержит дополнительное поле seniority (стаж)  и соответствующее ему свойство Seniority.

  1.  Создание класса  Manager (Менеджер). Класс также помещается в отдельный файл Managers. Класс Manager имеет вид:

// На интерфейс ISalSum пока не обращаем внимания

// (его можно пока не указывать)

class Manager:Assistant,ISalSum

   {

       

       int subordinate;

       

       public int Subordinate

       {

           get { return subordinate; }

           set { subordinate = value; }

       }

       public static bool f=false;

// На данную функцию пока не обращаем внимания

// (ее можно пока пропустить)

       double ISalSum.CalcSalSum()

       {

           Salarysum = this.Salary + this.Seniority * 0.2+subordinate*0.2;

           return Salarysum;

       }

// На данную функцию пока не обращаем внимания

       public void DoEvent(object sender, EventArgs e)

       {

            salarysum = salary + seniority * 0.2 + subordinate * 0.2;

       }

       

   }

Как видно из листинга, класс Assistant является дочерним классом класса Person и содержит дополнительное поле subordinate (количество подчиненных)  и соответствующее ему свойство Subordinate.

Кроме того, класс Manager содержит статическое поле f – признак того, что объект Manager создан, но его поля не заполнены.

  1.  Объявляем интерфейс ISalSum, содержащий объявление метода CalcSalSum – для расчета зарплаты. Интерфейс будет располагаться в отдельном файле ISalSum.cs, который создается  аналогично файлам для классов. Для создания  интерфейса щелкните правой кнопкой мыши по имени проекта (как показано на рисунке 3). В появившемся контекстном меню выберите пункты AddNew Item. В появившемся окне в списке Templates выберите пункт Interface и в поле Name введите имя ISalSum.cs. В C# принято, чтобы имена интерфейсов начинались с буквы «I». Класс ISalSum имеет вид:

interface ISalSum

   {

      double CalcSalSum();

   }

  1.  Функции, объявленные в интерфейсах, должны быть реализованы. В данном примере функция CalcSalSum реализована в классах  Assistant и Manager. Для реализации интерфейса:

7.1. При объявлении классов Assistant и Manager указывают интерфейс:

    class Assistant:Person, ISalSum

и

 class Manager:Assistant,ISalSum

7.2. Кроме того, классы  Assistant и Manager должны содержать программную реализацию функции CalcSalSum

  1.    В классе Form1 описываем глобальные переменные:

public ArrayList section = new ArrayList();

       Manager mngr;

Где объект  mngr (менеджер) нужен для того, чтобы использовать этот объект в различных функциях  класса Form1, а динамический список section служит для хранения списка продавцов.  Для корректной работы динамического списка  ArrayList  может быть придется добавить пространство имен  System.Collections;

  1.   Так как при изменении количества продавцов изменяется и зарплата менеджера в классе Assistant объявляем событие AddAssistant:

public event EventHandler AddAssistant;

Для реализации механизма обработки события  используется  стандартный делегат EventHandler

  1.  Событие AddAssistant будет издаваться при создании нового объекта Assistant (продавец). Логичнее было бы поместить издание события в конструктор. Но в данном примере событие AddAssistant издается при расчете зарплаты продавца (а так как расчет зарплаты происходит при создании объекта Assistant, то ошибки не будет)
  2.   Обработка события будет выполняться в двух классах Manager и Form1. В классе  Manager будет введена функция DoEvent для   пересчета зарплаты менеджера (см. листинг в пункте 5 ), а в классе  Form1 – функция ViewEvent для отображения на экране измененной зарплаты.
  3.  Функция  ViewEvent, реализованная в классе  Form1 имеет вид:

public void ViewEvent(object sender, EventArgs e)

       {

           textBox10.Text = mngr.Salarysum.ToString();

       }

  1.   Теперь событие сформировано  и обработчики события созданы. Осталось только подписаться на событие. Полписка на событие происходит при создании нового экземпляра класса Assistant (Событие Click  кнопки button1).
  2.  Для события Load  формы Form1 пишем следующий программный код:

private void Form1_Load(object sender, EventArgs e)

       {

           mngr = new Manager();

           Manager.f = false;

       }

Создание объекта manager и установка флага f=false (поля объекта менеджер еще не заполнены)

  1.   Для события Click кнопки button2 пишем следующий программный код:

   private void button2_Click(object sender, EventArgs e)

       {

           if (!Manager.f)

           {

               Manager.f = true;

               mngr.Name = textBox6.Text;

               mngr.Fio = textBox7.Text;

               mngr.Seniority = Convert.ToInt32(textBox8.Text);

               mngr.Salary = Convert.ToInt32(textBox9.Text);

               mngr.Subordinate = section.Count;

               

               ISalSum iss = (ISalSum)mngr;

               mngr.Salarysum = iss.CalcSalSum();

               textBox10.Text = mngr.Salarysum.ToString();

           }

           else MessageBox.Show("В отделе может быть только однн управляющий");

       }

Заполняются поля объекта mngr (менеджер), создается экземпляр класса интерфейса ISalSum (объкт iss) и расчитывается зарплата менеджера.

  1.    Для события Click кнопки button1 пишем следующий программный код:

private void button1_Click(object sender, EventArgs e)

       {

if (Manager.f)

           {

              

 Assistant ass = new Assistant();

               mngr.Subordinate =section.Count+1;

               ass.AddAssistant += new EventHandler(mngr.DoEvent);

               ass.AddAssistant += new EventHandler(ViewEvent);

               ass.Name = textBox1.Text;

               ass.Fio = textBox2.Text;

               ass.Seniority = Convert.ToInt32(textBox3.Text);

               ass.Salary = Convert.ToInt32(textBox5.Text);

              

               ISalSum iss = (ISalSum)ass;

               ass.Salarysum = iss.CalcSalSum();

               section.Add(ass);

               textBox4.Text += ass.Name + "  " + ass.Fio + "   " + ass.Salary.ToString() + "   " + ass.Seniority + "     " + ass.Salarysum.ToString() + (char)13 + (char)10;

           }

           else MessageBox.Show("Предварительно следует ввести информацию о менеджере");

       }

        

  1.  Для события Click кнопки button3 пишем следующий программный код:

private void button3_Click(object sender, EventArgs e)

       {

           textBox4.Clear();

           foreach (Assistant ass in section)

           {

               textBox4.Text += ass.Name + "  " + ass.Fio + "   " + ass.Salary.ToString() + "   " + ass.Seniority + "     " + ass.Salarysum.ToString() + (char)13 + (char)10;

           }

       }

Вывод в окно text4 списка всех продавцов

  1.   Для получения диаграммы классов в окне Solution Explorer щелкните правой кнопкой мыши по имени проекта (как показано на рисунке 3). В появившемся контекстном меню выберите пункт View Class Diagram.

3.Задания для самостоятельной работы

Построить иерархию классов в соответствии с вариантом задания. Предусмотреть, по крайней мере, два интерфейса и обработку событий ( предусмотреть хотя бы одно событие)

  1.  Ученик, бакалавр, магистр
  2.  Студент, преподаватель, заведующий кафедрой
  3.  Студент, группа, институт
  4.  Служащий,  рабочий, инженер
  5.  Рабочий, цех, предприятие
  6.  Рабочий,  инженер, администрация
  7.  Деталь, узел, механизм
  8.  Организация,  завод, страховая компания
  9.  Журнал, книга,  учебник
  10.  Тест, экзамен, выпускной экзамен
  11.  Город, область, страна
  12.  Водоем, озеро, море
  13.  Растение, куст,  дерево
  14.  Растение, дерево, лесной массив
  15.  Молочный продукт, сметана. сыр
  16.  Квитанция, накладная,  счет
  17.  Транспортное средство, автомобиль, поезд
  18.  Двигатель, двигатель внутреннего сгорания, реактивный двигатель
  19.  Государство, республика, монархия
  20.  Животное, млекопитающее, парнокопытное
  21.  Корабль, парусник, пароход
  22.  Летательный аппарат,  планер, самолет
  23.  Спортсмен, мастер спорта,  заслуженный мастер спорта

КОНТРОЛЬНЫЕ ВОПРОСЫ

  1.  Что понимается под термином «интерфейс»?
  2.  Чем отличается синтаксис интерфейса от синтаксиса абстрактного класса?
  3.  Какое ключевое слово языка C# используется для описания  интерфейса?
  4.  Поддерживают ли реализацию методы интерфейса?
  5.  Какие объекты языка C# могут быть членами интерфейсов?
  6.  Каким количеством классов может быть реализован интерфейс?
  7.  Может ли класс реализовывать множественные интерфейсы?
  8.  Необходима ли реализация методов интерфейса в классе, включающем  этот интерфейс?
  9.  Какой модификатор доступа соответствует интерфейсу?
  10.  Допустимо ли явное указание модификатора доступа для  интерфейса?
  11.  Приведите синтаксис интерфейса в общем  виде.  Проиллюстрируйте его фрагментом программы на языке C#.
  12.  Возможно ли создание ссылочной переменной интерфейсного  типа?
  13.  Возможно ли наследование интерфейсов?
  14.  Насколько синтаксис наследования интерфейсов отличается от  синтаксиса наследования классов?
  15.  Необходимо ли обеспечение реализации в иерархии наследуемых  интерфейсов?
  16.  Что понимается под термином «делегат»?
  17.  В чем состоят преимущества использования делегатов?
  18.  В какой момент осуществляется выбор вызываемого метода в случае использования делегатов?
  19.  Что является значением делегата?
  20.  Какое ключевое слово языка C# используется для описания  делегатов?
  21.  Приведите синтаксис делегата в общем виде. Проиллюстрируйте  его фрагментом программы на языке C#.
  22.  Возможно ли использование делегата для вызова метода, соответствующего подписи делегата?
  23.  Возможен ли вызов метода в том случае, если его подпись не соответствует подписи делегата?
  24.  Что понимается под термином «многоадресность»?
  25.  В чем состоит практическое значение многоадресности?
  26.  Каким образом осуществляется создание цепочки методов для   многоадресных делегатов?
  27.  Какие операторы языка C# используются для создания цепочки методов для многоадресных делегатов?
  28.  Каким образом осуществляется удаление цепочки методов для  многоадресных делегатов?
  29.  Какие операторы языка C# используются для удаления цепочки  методов для многоадресных делегатов?
  30.  Каким должен быть тип возвращаемого значения для  многоадресных делегатов?
  31.  Что понимается под термином «событие»?
  32.  Являются ли события членами классов?
  33.  Какое ключевое слово языка C# используется для описания событий?
  34.  На каком механизме языка C# основана поддержка событий?
  35.  Приведите синтаксис описания события в общем виде.  Проиллюстрируйте его фрагментом программы на языке C#.
  36.  Что понимается под термином «широковещательное событие»?


Рисунок 1 – диаграмма классов приложения «Отдел магазина»

Рисунок 2 – экранная форма разработанного приложения

Рисунок 3- Создание нового файла для очередного класса

Рисунок 4 – Создание файла для нового класса


 

А также другие работы, которые могут Вас заинтересовать

11460. ОЦЕНКА СОДЕРЖАНИЯ ГОМОГЕНТИЗИНОВОЙ КИСЛОТЫ В МОЧЕ 29 KB
  ЛАБОРАТОРНАЯ РАБОТА Оценка содержания гомогентизиновой кислоты в моче ПРИНЦИП МЕТОДА. Определяемая в моче гомогентизиновая кислота является продуктом окислительного катаболизма аминокислоты тирозина. Оценка содержания гомогентизиновой кислоты основывается
11461. Информатика в 7 классе. Все конспекты уроков 2.05 MB
  Дополнительные материалы для любознательных обозначены значком. Учебное методическое пособие предполагает наличие в школьном кабинете информатики IBM-совместимых компьютеров, организованных в локальную сеть, а также программного обеспечения: операционной системы Windows, браузера Internet Explorer, редактора презентаций Microsoft PowerPoint, системы программирования Pascal ABC.
11462. ОПРЕДЕЛЕНИЕ СОДЕРЖАНИЯ БИТИРОЗИНА И ОКИСЛЕННОГО ТРИПТОФАНА В ПЛАЗМЕ КРОВИ 28.5 KB
  ЛАБОРАТОРНАЯ РАБОТА ознакомительная Определение содержания битирозина и окисленного триптофана в плазме крови ПРИНЦИП МЕТОДА. Оценку содержания битирозина и окисленного триптофана проводят методом K.J. Davies 1987 в модификации Э.М. Бекмана и cоавторов 2006. В резуль
11463. ОПРЕДЕЛЕНИЕ СУММЫ ВОССТАНОВЛЕННОГО ГЛУТАТИОНА И ЦИСТЕИНА В КРОВИ 24 KB
  ЛАБОРАТОРНАЯ РАБОТА Определение суммы восстановленного глутатиона и цистеина в крови ПРИНЦИП МЕТОДА. SHгруппа в составе аминокислоты цистеина и трипептида глутатиона обладает восстановительными свойствами и может под влиянием окислителей превращаться в дисул
11464. ОПРЕДЕЛЕНИЕ АКТИВНОСТИ КАТАЛАЗЫ 37 KB
  ЛАБОРАТОРНАЯ РАБОТА Определение активности каталазы 1.11.1.6 1 с помощью перманганата калия и вычислением каталазного числа метод Баха и Зубковой ПРИНЦИП МЕТОДА. Фермент каталаза содержится в большом количестве в эритроцитах а также во всех тканях и жидкост...
11465. Оценка активности супероксиддисмутазы в сыворотке крови 38.5 KB
  Лабораторная работа Оценка активности супероксиддисмутазы в сыворотке крови демонстрационная 1 по ингибированию восстановления нитротетразолия синего Принцип. Об активности фермента супероксиддисмутазы СОД свидетельствует его способность тормозить восс...
11466. Культурологія як наукова і навчальна дисципліна. Специфіка культурологічного знання 8.8 MB
  Тема: Культурологія як наукова і навчальна дисципліна. Специфіка культурологічного знання. Курс Культурологія входить до циклу дисциплін гуманітарної та соціальноекономічної підготовки студента у вищих закладах освіти який дає змогу обєднати такі дисципліни як...
11467. КРИЗОВІ ЯВИЩА В КУЛЬТУРІ 204 KB
  Лекція 12.КРИЗОВІ ЯВИЩА В КУЛЬТУРІ Весь попередній розгляд сутності та проявів культури засвідчує що її можна вважати тією територією людськості яка відвойована людиною в шаленого масиву природи та яка засвідчує ті прояви людини котрі вона своєю творчою насн
11468. Основні концептуальні парадигми (концепції, теорії та напрями) культурології 147.5 KB
  Лекція 2. Основні концептуальні парадигми концепції теорії та напрями культурології. Донауковий етап уявлень про культуру. Ще в давніх міфах є спроба відповісти на питання про початок культурної історії людства. В легендах і міфах кожного народу є легендарні гер...