В реальном мире каждый предмет или процесс обладает набором статических и динамических характеристик (свойствами и поведением). Поведение объекта зависит от его состояния и внешних воздействий. Понятие объекта в программе совпадает с обыденным смыслом этого слова: объект представляется как совокупность данных, характеризующих его состояние, и функций их обработки, моделирующих его поведение. Вызов функции на выполнение часто называют посылкой сообщения объекту. При создании объектно-ориентированной программы предметная область представляется в виде совокупности объектов. Выполнение программы состоит в том, что объекты обмениваются сообщениями. При представлении реального объекта с помощью программного необходимо выделить в первом его существенные особенности и игнорировать несущественные. Это называется абстрагированием. Таким образом, программный объект — это абстракция. Детали реализации объекта скрыты, он используется через его интерфейс — совокупность правил доступа. Скрытие деталей реализации называется инкапсуляцией. Это позволяет представить программу в укрупненном виде — на уровне объектов и их взаимосвязей, а следовательно, управлять большим объемом информации. Итак, объект — это инкапсулированная абстракция с четко определенным интерфейсом. Важное значение имеет возможность многократного использования кода. Для объекта можно определить наследников, корректирующих или дополняющих его поведение. Наследование применяется для: исключения из программы повторяющихся фрагментов кода; упрощения модификации программы; упрощения создания существующих. новых программ на основе Благодаря наследованию появляется возможность использовать объекты, исходный код которых недоступен, но в которые требуется внести изменения. Наследование позволяет создавать иерархии объектов. Иерархия представляется в виде дерева, в котором более общие объекты располагаются ближе к корню, а более специализированные — на ветвях и листьях. ООП позволяет писать гибкие, расширяемые и читабельные программы. Во многом это обеспечивается благодаря полиморфизму, под которым понимается возможность во время выполнения программы с помощью одного и того же имени выполнять разные действия или обращаться к объектам разного типа. Чаще всего понятие полиморфизма связывают с механизмом виртуальных методов. использование при программировании понятий, близких к предметной области; возможность успешно управлять большими объемами исходного кода благодаря инкапсуляции, то есть скрытию деталей реализации объектов и упрощению структуры программы; возможность многократного использования кода за счет наследования; сравнительно программ; возможность объектов. простая создания возможность и модификации использования библиотек некоторое снижение быстродействия программы, связанное с использованием виртуальных методов; идеи ООП не просты для понимания и в особенности для практического использования; для эффективного использования существующих объектно-ориентированных систем требуется большой объем первоначальных знаний; неграмотное применение ООП может привести к значительному ухудшению характеристик разрабатываемой программы. Классом называется весьма общая сущность, Свойством (или атрибутом) называется Методом (или функцией) называется которая может быть определена как совокупность элементов. пропозициональная функция, определенная на произвольном типе (данных). операция, определенная над объектами некоторого класса. описание класса как типа данных; объявление объектных переменных (экземпляров класса, объектов); создание и инициализация объектов; выполнение необходимых операций с объектными переменными в программе; уничтожение ненужных объектных переменных константы; поля; методы; свойства; конструкторы; деструкторы; индексаторы (обеспечивают доступ к элементам класса по их порядковым номерам); обработчики событий. атрибуты спецификаторы class : список классов-предков { Описания констант; Описания полей; Описания методов; Описания свойств; Описания конструкторов; Описания деструкторов; Описания индексаторов; Описания обработчиков событий } Простейший пример описания: class C1 {} // пустой класс public Доступ не ограничен protected Доступ только из элементов рассматриваемого класса и его потомков internal Доступ только из сборки, в которой находится класс protected internal Доступ типа protected, но только из элементов рассматриваемого класса и его потомков, размещённых внутри рассматриваемой сборки private Доступ только для членов класса, доступных в рамках объявляемого класса abstract Абстрактный класс – это класс, на основе которого можно создавать только классы-наследники, но не объекты sealed Бесплодный класс – это класс, на основе которого можно создавать только объекты, но не классы-наследники static Статический класс или его элемент (поле, метод) позволяет обращаться к нему, не создавая объектов Методы определяют поведение класса. Каждый метод класса должен решать только одну задачу. Создание любого метода следует начинать с его интерфейса (заголовка). Необходимо четко представлять себе, какие параметры метод должен получать и какие результаты формировать. Входные параметры обычно перечисляют в начале списка параметров. Поля, характеризующие класс в целом, следует описывать как статические. Все литералы, связанные с классом, описываются как поляконстанты с именами, отражающими их смысл. Необходимо стремиться к максимальному сокращению области действия каждой переменной. Это упрощает отладку программы, поскольку ограничивает область поиска ошибки. атрибуты спецификаторы const тип имя = начальное значение; Примеры описания констант: static const int n =0; double const g =9.81; Примеры использования констант: int [] p = new int[n]; y = g*t*t/2.0; атрибуты спецификаторы тип имя; Примеры описания полей: static int r; public int x; Пример использования полей: A.r = b.x; Спецификатор Описание new public Новое описание поля, скрывающее унаследованный элемент класса Доступ к элементу не ограничен protected Доступ только из данного и производных классов internal Доступ только из данной сборки protected internal private Доступ только из данного и производных классов и из данной сборки Доступ только из данного класса static Одно поле для всех экземпляров класса readonly Поле доступно только для чтения volatile Поле может изменяться другим процессом или системой Методы бывают: Типизированные; Нетипизированные. Формат описания типизированных методов имеет вид: Модификатор_доступа тип_результата имя_метода(список параметров) { Объявления переменных Инструкции Return выражение } Пример описания типизированного метода: public float tsr() { float s = 0; float sr; for (int i = 0; i < 7; i++) { s += Convert.ToSingle(a[i]); } sr = s / 7; return sr; } Примеры вызова на исполнение типизированного метода: Console.WriteLine("Средняя температура: sr= " + m.tsr()); y = m.tsr(); Модификатор_доступа void имя_метода(список параметров) { Объявления переменных Инструкции } Пример описания нетипизированного метода: public void tmax() { for (int i = 0; i < 7; i++) { if (a[i] > max) { max = a[i]; nmax = i; } Примеры вызова на исполнение нетипизированного метода: m.tmax(); В С# четыре типа параметров: параметры-значения - для исходных данных метода; параметры-ссылки (ref) - для изменения аргумента; выходные параметры (out) – для формирования аргумента; параметры-массивы (params) – для переменного колва аргументов. Пример: public int Calculate( int a, ref int b, out int c, params int[] d){…} атрибуты спецификаторы тип Имя_свойства { get {код доступа return Имя_свойства;} set {код доступа;} } Пример описания свойства: int x; // описываем поле x public int X // описываем свойство X для поля x { get { return x; } set { x = value; } } Примеры обращения к полю x объекта a с использованием свойства X: a.X = 5; y = a.X; Конструктор – это специализированный метод, предназначенный для создания и инициализации объектов. Конструктор вызывается на исполнение с помощью инструкции new и имени класса. Свойства конструкторов: Имя конструктора всегда такое же, как и имя соответствующего ему класса. Конструктор, не имеющий параметров, называется конструктором по умолчанию. При вызове такого конструктора значимым полям создаваемого объекта автоматически присваиваются нулевые значения, а ссылочным полям – значение null. При выполнении конструктор не возвращает в программу никаких значений. Класс может иметь несколько конструкторов с разными наборами параметров инициализации. using System; using System.Collections.Generic; using System.Text; class Point // класс Точка { // ----- поля класса public int x; public int y; // ------ конструктор класса public Point(int x1, int y1) { x = x1; y = y1; } } Деструктор – это специальный вид метода для высвобождения памяти, занимаемой неиспользуемыми объектами (уничтожение неиспользуемых объектов). Отличие в описании деструктора от конструктора состоит в том, что в деструкторе перед именем класса ставится значок тильда (~). В теле деструктора обычно описываются дополнительные действия, выполняемые в ходе удаления неиспользуемых объектов из памяти. Пример описания производного базового класса C1: класса C2 на основе public class C1 { Описание элементов класса C1 } // ----- Описание класса C2 – производного от класса C1. public class C2 : C1 { Описание элементов класса C2 } public class C1 { public int x1; public C1( int p1) //Конструктор класса C1 { this.x1=p; } } // ------- Описание класса C2 – производного от класса C1 public class C2: C1 { public int x2; // Конструктор класса C2 вызывает конструктор базового класса C1 base () public C2(int p1, int p2): base(p1) { this.x2=p2; } }