270 likes | 440 Views
Классы в С #. Понятие объекта. В реальном мире каждый предмет или процесс обладает набором статических и динамических характеристик (свойствами и поведением). Поведение объекта зависит от его состояния и внешних воздействий.
E N D
Понятие объекта • В реальном мире каждый предмет или процесс обладает набором статических и динамических характеристик (свойствами и поведением). Поведение объекта зависит от его состояния и внешних воздействий. • Понятие объекта в программе совпадает с обыденным смыслом этого слова: объект представляется как совокупность данных, характеризующих его состояние, и функций их обработки, моделирующих его поведение. Вызов функции на выполнение часто называют посылкой сообщения объекту. • При создании объектно-ориентированной программы предметная область представляется в виде совокупности объектов. Выполнение программы состоит в том, что объекты обмениваются сообщениями.
Абстрагирование и инкапсуляция • При представлении реального объекта с помощью программного необходимо выделить в первом его существенные особенности и игнорировать несущественные. Это называется абстрагированием. • Таким образом, программный объект — это абстракция. • Детали реализации объекта скрыты, он используется через его интерфейс — совокупность правил доступа. • Скрытие деталей реализации называется инкапсуляцией. Это позволяет представить программу в укрупненном виде — на уровне объектов и их взаимосвязей, а следовательно, управлять большим объемом информации. • Итак, объект — это инкапсулированная абстракция с четко определенным интерфейсом.
Наследование • Важное значение имеет возможность многократного использования кода. Для объекта можно определить наследников, корректирующих или дополняющих его поведение. • Наследование применяется для: • исключения из программы повторяющихся фрагментов кода; • упрощения модификации программы; • упрощения создания новых программ на основе существующих. • Благодаря наследованию появляется возможность использовать объекты, исходный код которых недоступен, но в которые требуется внести изменения. • Наследование позволяет создавать иерархии объектов. Иерархия представляется в виде дерева, в котором более общие объекты располагаются ближе к корню, а более специализированные — на ветвях и листьях.
Полиморфизм • ООП позволяет писать гибкие, расширяемые и читабельные программы. • Во многом это обеспечивается благодаря полиморфизму, под которым понимается возможность во время выполнения программы с помощью одного и того же имени выполнять разные действия или обращаться к объектам разного типа. • Чаще всего понятие полиморфизма связывают с механизмом виртуальных методов.
Достоинства ООП • использование при программировании понятий, близких к предметной области; • возможность успешно управлять большими объемами исходного кода благодаря инкапсуляции, то есть скрытию деталей реализации объектов и упрощению структуры программы; • возможность многократного использования кода за счет наследования; • сравнительно простая возможность модификации программ; • возможность создания и использования библиотек объектов.
Недостатки ООП • некоторое снижение быстродействия программы, связанное с использованием виртуальных методов; • идеи ООП не просты для понимания и в особенности для практического использования; • для эффективного использования существующих объектно-ориентированных систем требуется большой объем первоначальных знаний; • неграмотное применение ООП может привести к значительному ухудшению характеристик разрабатываемой программы.
Основные определения • Классом называется весьма общая сущность, которая может быть определена как совокупность элементов. • Свойством (или атрибутом) называется пропозициональная функция, определенная на произвольном типе (данных). • Методом (или функцией) называется операция, определенная над объектами некоторого класса.
Жизненный цикл класса • описание класса как типа данных; • объявление объектных переменных (экземпляров класса, объектов); • создание и инициализация объектов; • выполнение необходимых операций с объектными переменными в программе; • уничтожение ненужных объектных переменных
Состав класса • константы; • поля; • методы; • свойства; • конструкторы; • деструкторы; • индексаторы (обеспечивают доступ к элементам класса по их порядковым номерам); • обработчики событий.
Формат объявления класса атрибуты спецификаторыclass :список классов-предков { Описания констант; Описания полей; Описания методов; Описания свойств; Описания конструкторов; Описания деструкторов; Описания индексаторов; Описания обработчиков событий } Простейший пример описания: class C1 {} // пустой класс
Элементы класса • Методы определяют поведение класса. Каждый метод класса должен решать только одну задачу. • Создание любого метода следует начинать с его интерфейса (заголовка). Необходимо четко представлять себе, какие параметры метод должен получать и какие результаты формировать. Входные параметры обычно перечисляют в начале списка параметров. • Поля, характеризующие класс в целом, следует описывать как статические. • Все литералы, связанные с классом, описываются как поля-константы с именами, отражающими их смысл. • Необходимо стремиться к максимальному сокращению области действия каждой переменной. Это упрощает отладку программы, поскольку ограничивает область поиска ошибки.
Описания констант атрибуты спецификаторы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;
Описания методов Методы бывают: • Типизированные; • Нетипизированные. Формат описания типизированных методов имеет вид: Модификатор_доступа тип_результата имя_метода(список параметров) { Объявления переменных Инструкции 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 publicintX // описываем свойство 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; } }
Деструкторы • Деструктор – это специальный вид метода для высвобождения памяти, занимаемой неиспользуемыми объектами (уничтожение неиспользуемых объектов). • Отличие в описании деструктора от конструктора состоит в том, что в деструкторе перед именем класса ставится значок тильда (~). В теле деструктора обычно описываются дополнительные действия, выполняемые в ходе удаления неиспользуемых объектов из памяти.
Производные классы Пример описания производного класса C2 на основе базового класса C1: 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; } }