Скачать презентацию Введение в ООП Category Ratings August 2012 Delta Скачать презентацию Введение в ООП Category Ratings August 2012 Delta

lec_04.pptx

  • Количество слайдов: 83

Введение в ООП Category Ratings August 2012 Delta August 2011 Object-Oriented Languages 57. 1% Введение в ООП Category Ratings August 2012 Delta August 2011 Object-Oriented Languages 57. 1% +1. 8% Procedural Languages 37. 8% -0. 4% Functional Languages 3. 4% -1. 5% Logical Languages 1. 7% +0. 1% "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning. " Rich Cook ©Павловская Т. А. (НИУ ИТМО) 1

Понятие объекта n В реальном мире каждый предмет или процесс обладает свойствами и поведением Понятие объекта n В реальном мире каждый предмет или процесс обладает свойствами и поведением (набором статических и динамических характеристик). Поведение объекта зависит от его состояния и внешних воздействий. n Понятие объекта в программе совпадает с обыденным смыслом этого слова: объект представляется как совокупность: n данных, характеризующих его состояние, и n функций их обработки, моделирующих его поведение. n Вызов функции на выполнение часто называют посылкой сообщения объекту. n При создании объектно-ориентированной программы предметная область представляется в виде совокупности объектов. Выполнение программы состоит в том, что объекты обмениваются сообщениями. ©Павловская Т. А. (НИУ ИТМО) 2

Пример ОО-программы class Двигатель { public void Запуск() { Console. Write. Line( Пример ОО-программы class Двигатель { public void Запуск() { Console. Write. Line( "пыщь" ); } } Конструктор класса Самолет class Самолет Метод (функция) Запуск класса Двигатель Метод Запустить_двигатели класса Самолет { public Самолет() { левый = new Двигатель(); правый = new Двигатель(); } public void Запустить_двигатели() { левый. Запуск(); правый. Запуск(); _ } Двигатель левый, правый; } Поля класса Самолет class Client { static void Main() { Самолет АН 24_1 = new Самолет(); АН 24_1. Запустить_двигатели(); __ } Объект АН 24_1 } класса Самолет ©Павловская Т. А. (НИУ ИТМО) посылка сообщения объекту правый посылка сообщения объекту АН 24_1 Результат работы программы: пыщь 3

Абстрагирование и инкапсуляция n При представлении реального объекта с помощью программного необходимо выделить в Абстрагирование и инкапсуляция n При представлении реального объекта с помощью программного необходимо выделить в первом его существенные особенности и игнорировать несущественные. Это называется абстрагированием. n Таким образом, программный объект — это абстракция. n Детали реализации объекта скрыты, он используется через его интерфейс — совокупность правил доступа. n Скрытие деталей реализации называется инкапсуляцией. Это позволяет представить программу в укрупненном виде — на уровне объектов и их взаимосвязей, а следовательно, управлять большим объемом информации. n Итак, объект — это инкапсулированная абстракция с четко определенным интерфейсом. encapsulation ©Павловская Т. А. (НИУ ИТМО) 4

Иллюстрация инкапсуляции class Двигатель { public void Запуск() { Console. Write. Line( Иллюстрация инкапсуляции class Двигатель { public void Запуск() { Console. Write. Line( " пыщь " ); } "взззззз" } Метод Main не знает, как именно запускаются двигатели class Самолет { public Самолет() { левый = new Двигатель(); правый = new Двигатель(); } лев 1 = … public void Запустить_двигатели() { левый. Запуск(); правый. Запуск(); } лев 1. Запуск(); … Двигатель левый, правый ; // скрытые поля данных лев 1, лев 2, пр1, пр2; } class Class 1 Результат { static void Main() работы программы: { Самолет АН 24_1 = new Самолет(); взззззз АН 24_1. Запустить_двигатели(); взззззз } взззззззззззз ©Павловская Т. А. (НИУ ИТМО) 5

Наследование n Наследование (inheritance) - это процесс, посредством которого один объект может приобретать свойства Наследование n Наследование (inheritance) - это процесс, посредством которого один объект может приобретать свойства другого. n Важное значение имеет возможность многократного использования кода. Для объекта можно определить наследников, корректирующих или дополняющих его поведение. n Наследование применяется для: n исключения из программы повторяющихся фрагментов кода; n упрощения модификации программы; n упрощения создания новых программ на основе существующих. n Благодаря наследованию появляется возможность использовать объекты, исходный код которых недоступен, но в которые требуется внести изменения. n Наследование позволяет создавать иерархии объектов. Иерархия представляется в виде дерева, в котором более общие объекты располагаются ближе к корню, а более специализированные — на ветвях и листьях. ©Павловская Т. А. (НИУ ИТМО) 6

Пример иерархии: классы. NET для работы с потоками ©Павловская Т. А. (НИУ ИТМО) 7 Пример иерархии: классы. NET для работы с потоками ©Павловская Т. А. (НИУ ИТМО) 7

Полиморфизм n Полиморфизм – это возможность использовать одно имя для решения нескольких схожих, но Полиморфизм n Полиморфизм – это возможность использовать одно имя для решения нескольких схожих, но технически разных задач, или обращаться к объектам разного типа. n Идея полиморфизма: "один интерфейс, множество методов" n Пример: в языке С: abs(), labs() и fabs(), в C# - Math. Abs() n Существует несколько видов полиморфизма: n n перегрузка операций n виртуальные методы n n перегрузка методов параметризованные классы Console. Write. Line операция + для int и string Чаще всего понятие полиморфизма связывают с механизмом виртуальных методов. ©Павловская Т. А. (НИУ ИТМО) 8

Пример полиморфизма Spirit class Spirit {. . . Vampire virtual Act () {. . Пример полиморфизма Spirit class Spirit {. . . Vampire virtual Act () {. . . } Monster } Daemon class Monster: Spirit {. . . virtual Act () {. . . } class Class 1 } { Main class Vampire: Spirit { {. . . Spirit [] stado = new Spirit[100]; virtual Act () {. . . } . . . // занесение чудовищ в массив } class Daemon: Monster foreach (Spirit creature in stado) {. . . creature. Act(); virtual Act () {. . . } } } } ©Павловская Т. А. (НИУ ИТМО) 9

Достоинства ООП n использование при программировании понятий, близких к предметной области; n возможность успешно Достоинства ООП n использование при программировании понятий, близких к предметной области; n возможность успешно управлять большими объемами исходного кода благодаря инкапсуляции, то есть скрытию деталей реализации объектов и упрощению структуры программы; n возможность многократного использования кода за счет наследования; n сравнительно простая возможность модификации программ; n возможность создания и использования библиотек объектов. ©Павловская Т. А. (НИУ ИТМО) 10

Недостатки ООП n идеи ООП не просты для понимания и в особенности для практического Недостатки ООП n идеи ООП не просты для понимания и в особенности для практического использования n для эффективного использования существующих объектно-ориентированных систем и библиотек требуется большой объем первоначальных знаний n неграмотное применение ООП может привести к значительному ухудшению характеристик разрабатываемой программы n некоторое снижение быстродействия программы, связанное с использованием виртуальных методов ©Павловская Т. А. (НИУ ИТМО) 11

Понятие класса (повторение) n Класс является типом данных, определяемым пользователем. Он должен представлять собой Понятие класса (повторение) n Класс является типом данных, определяемым пользователем. Он должен представлять собой одну логическую сущность, например, являться моделью реального объекта или процесса. Элементами класса являются данные и функции, предназначенные для их обработки (методы). n Все классы. NET имеют общего предка — класс object, и организованы в единую иерархическую структуру. n Классы логически сгруппированы в пространства имен, которые служат для упорядочивания имен классов и предотвращения конфликтов имен: в разных пространствах имена могут совпадать. Пространства имен могут быть вложенными. n Любая программа использует пространство имен System. ©Павловская Т. А. (НИУ ИТМО) 13

Описание класса [ атрибуты ] [ спецификаторы ] class имя_класса [ : предки ] Описание класса [ атрибуты ] [ спецификаторы ] class имя_класса [ : предки ] тело_класса n Имя класса задается по общим правилам. n Тело класса — список описаний его элементов, заключенный в фигурные скобки. n Атрибуты задают дополнительную информацию о классе. n Спецификаторы определяют свойства класса, а также доступность класса для других элементов программы. n Простейшие примеры описания класса: class Demo {} // пустой класс public class Двигатель // класс с одним методом { public void Запуск() { Console. Write. Line( " пыщь " ); } } ©Павловская Т. А. (НИУ ИТМО) 14

Спецификаторы класса Спецификатор Описание new (для вложенных классов). Задает новое описание класса взамен унаследованного Спецификаторы класса Спецификатор Описание new (для вложенных классов). Задает новое описание класса взамен унаследованного от предка. Применяется в иерархиях public Доступ не ограничен protected Используется для вложенных классов. Доступ только из элементов данного и производных классов internal Доступ только из данной программы (сборки) protected internal Доступ только из данного и производных классов или из данной программы (сборки) private (для вложенных классов). Доступ только из элементов класса, внутри которого описан данный класс abstract Абстрактный класс. Применяется в иерархиях sealed Бесплодный класс. Применяется в иерархиях static Статический класс. ©Павловская Т. А. (НИУ ИТМО) 15

Элементы класса класс локальные типы данные функции поля (переменные) свойства константы события поля экземпляра Элементы класса класс локальные типы данные функции поля (переменные) свойства константы события поля экземпляра один набор на класс статические индексаторы методы поля один набор на каждый экземпляр операции конструкторы экземпляра конструкторы деструкторы статические конструкторы обычные методы экземпляра ©Павловская Т. А. (НИУ ИТМО) методы класса 16

Сквозной пример класса class Monster { public Monster() // конструкторы { name = Сквозной пример класса class Monster { public Monster() // конструкторы { name = "Noname"; health = 100; ammo = 100; } public Monster( string name ) : this() { this. name = name; } public Monster( int health, int ammo, string name ) { this. name = name; this. health = health; this. ammo = ammo; } public string Get. Name() // метод { return name; } public int Get. Ammo() // метод { return ammo; } ©Павловская Т. А. (НИУ ИТМО) public int Health { // свойство get { return health; } set { if (value > 0) health = value; else health = 0; } } public void Passport() // метод { Console. Write. Line( "Monster {0} t health = {1} ammo = {2}", name, health, ammo ); } public override string To. String(){ string buf = string. Format( "Monster {0} t health = {1} ammo = {2}", name, health, ammo); return buf; } string name; // поле int health, ammo; // поле } 17

Описание объекта (экземпляра) n Класс является обобщенным понятием, определяющим характеристики и поведение множества конкретных Описание объекта (экземпляра) n Класс является обобщенным понятием, определяющим характеристики и поведение множества конкретных объектов этого класса, называемых экземплярами (объектами) класса. n Объекты создаются явным или неявным образом (либо программистом, либо системой). Программист создает экземпляр класса с помощью операции new: Demo a = new Demo(); Monster Vasia = new Monster(); Monster Petya = new Monster(“Петя“); n Для каждого объекта при его создании в памяти выделяется отдельная область для хранения его данных. n Кроме того, в классе могут присутствовать статические элементы, которые существуют в единственном экземпляре для всех объектов класса. n Функциональные элементы класса всегда хранятся в единственном экземпляре. ©Павловская Т. А. (НИУ ИТМО) 18

Пример создания объектов (экземпляров) class Monster {. . . } class Class 1 { Пример создания объектов (экземпляров) class Monster {. . . } class Class 1 { static void Main() { Monster X = new Monster(); X. Passport(); Monster Vasia = new Monster("Вася" ); Vasia. Passport(); Monster Masha = new Monster( 200, "Маша" ); Сonsole. Writeline(Masha); } } ©Павловская Т. А. (НИУ ИТМО) Результат работы программы: Monster Noname health = 100 ammo = 100 Monster Вася health = 100 ammo = 100 Monster Маша health = 200 ammo = 200 19

Присваивание и сравнение объектов (повторение) Хип Стек Значение Ссылка а b c Объекты n Присваивание и сравнение объектов (повторение) Хип Стек Значение Ссылка а b c Объекты n b = c n Величины ссылочного типа равны, если они ссылаются на одни и те же данные (b == c, но a != b даже при равенстве их значений или если обе ссылки равны null). ©Павловская Т. А. (НИУ ИТМО) 20

Данные: поля и константы n Данные, содержащиеся в классе, могут быть переменными или константами. Данные: поля и константы n Данные, содержащиеся в классе, могут быть переменными или константами. n Переменные, описанные в классе, называются полями класса. n При описании полей можно указывать атрибуты и спецификаторы, задающие различные характеристики элементов: [ атрибуты ] [ спецификаторы ] [ const ] тип имя [ = начальное_значение ] public int a = 1; public static string s = "Demo"; double y; n Все поля сначала автоматически инициализируются нулем соответствующего типа (например, полям типа int присваивается 0, а ссылкам на объекты — значение null). После этого полю присваивается значение, заданное при его явной инициализации. ©Павловская Т. А. (НИУ ИТМО) 21

Пример класса using System; namespace CA 1 { class Demo { public int a Пример класса using System; namespace CA 1 { class Demo { public int a = 1; // поле данных public const double c = 1. 66; // константа public static string s = "Demo"; // статическое поле класса double y; // закрытое поле данных } class Class 1 { static void Main() { Demo x = new Demo(); // создание экземпляра класса Demo Console. Write. Line( x. a ); // x. a - обращение к полю класса Console. Write. Line( Demo. c ); // Demo. c - обращение к константе Console. Write. Line( Demo. s ); // обращение к статическому полю }}} ©Павловская Т. А. (НИУ ИТМО) 22

Спецификаторы полей и констант класса Спецификатор Описание new Новое описание поля, скрывающее унаследованный элемент Спецификаторы полей и констант класса Спецификатор Описание new Новое описание поля, скрывающее унаследованный элемент класса public Доступ к элементу не ограничен protected Доступ только из данного и производных классов internal Доступ только из данной сборки protected internal Доступ только из данного и производных классов и из данной сборки private Доступ только из данного класса static Одно поле для всех экземпляров класса readonly Поле доступно только для чтения volatile Поле может изменяться другим процессом или системой ©Павловская Т. А. (НИУ ИТМО) 23

Методы n Метод — функциональный элемент класса, реализующий вычисления или другие действия. Методы определяют Методы n Метод — функциональный элемент класса, реализующий вычисления или другие действия. Методы определяют поведение класса и составляют его интерфейс. n Метод — законченный фрагмент кода, к которому можно обратиться по имени. Он описывается один раз, а вызываться может столько раз, сколько необходимо. n Один и тот же метод может обрабатывать различные данные, переданные ему в качестве аргументов. double a = 0. 1; double b = Math. Sin(a); double c = Math. Sin(b-2*a); Console. Write. Line(a); ©Павловская Т. А. (НИУ ИТМО) 24

Синтаксис метода [ атрибуты ] [ спецификаторы ] тип имя_метода ( [ параметры ] Синтаксис метода [ атрибуты ] [ спецификаторы ] тип имя_метода ( [ параметры ] ) тело_метода n n n Спецификаторы: new, public, protected, internal, protected internal, private, static, virtual, sealed, override, abstract, extern. Метод класса имеет непосредственный доступ к его полям. Пример: class Demo { double y; // закрытое поле класса public void Set_y( double z ) // открытый метод класса { y = z; } } … Demo demo = new Demo(); // где-то в методе другого класса demo. Set_y(3. 12); … // вызов метода

Примеры методов public void Set_y(double z) { y = z; } public double Get_y() Примеры методов public void Set_y(double z) { y = z; } public double Get_y() { return y; } n n Вызывающий метод Вызов метода Тип метода определяет, значение какого типа вычисляется с помощью метода Параметры используются для обмена информацией с методом. Параметр - локальная переменная, которая при вызове метода принимает значение соответствующего аргумента. ©Павловская Т. А. (НИУ ИТМО) Метод return […] Возврат значения demo. Set_y(3. 12); double t = demo. Get_y(); 26

Параметры методов n Параметры определяют множество значений аргументов, которые можно передавать в метод. n Параметры методов n Параметры определяют множество значений аргументов, которые можно передавать в метод. n Список аргументов при вызове как бы накладывается на список параметров, поэтому они должны попарно соответствовать другу. n Для каждого параметра должны задаваться его тип, имя и, возможно, вид параметра. n Имя метода вкупе с количеством, типами и спецификаторами его параметров представляет собой сигнатуру метода — то, по чему один метод отличают от других. n В классе не должно быть методов с одинаковыми сигнатурами. n Метод, описанный со спецификатором static, должен обращаться только к статическим полям класса. n Статический метод вызывается через имя класса, а обычный — через имя экземпляра. ©Павловская Т. А. (НИУ ИТМО) 27

Пример class Demo { public int a = 1; public const double c = Пример class Demo { public int a = 1; public const double c = 1. 66; static string s = "Demo"; double y; public double Get_y() { return y; } // метод получения y public void Set_y( double y_ ){ y = y_; } // метод установки y public static string Get_s() { return s; } // метод получения s } class Client { static void Main() { Demo x = new Demo(); x. Set_y(0. 12); // вызов метода установки y Console. Write. Line(x. Get_y()); // вызов метода получения y Console. Write. Line(Demo. Get_s()); // вызов метода получения s // Console. Write. Line(Get_s()); // вариант вызова из того же }} // класса ©Павловская Т. А. (НИУ ИТМО) 28

Вызов метода 1. 2. 3. 4. 5. Вычисляются выражения, стоящие на месте аргументов. Выделяется Вызов метода 1. 2. 3. 4. 5. Вычисляются выражения, стоящие на месте аргументов. Выделяется память под параметры метода. Каждому из параметров сопоставляется соответствующий аргумент. При этом проверяется соответствие типов аргументов и параметров и при необходимости выполняется их преобразование. При несоответствии типов выдается диагностическое сообщение. Выполняется тело метода. Если метод возвращает значение, оно передается в точку вызова; если метод имеет тип void, управление передается на оператор, следующий после вызова. Описание объекта: Some. Obj obj = new Some. Obj(); Описание аргументов: int b; double a, c; Вызов метода: obj. P(a, b, c); Заголовок метода P: public void P(double x, int y, double z); ©Павловская Т. А. (НИУ ИТМО) 29

Примеры передачи аргументов в метод class Class 1 { static int Max(int a, int Примеры передачи аргументов в метод class Class 1 { static int Max(int a, int b) // метод выбора макс. значения { return a > b ? a : b; } static void Main() { int a = 2, b = 4; int x = Max( a, b ); // вызов метода Max Console. Write. Line( x ); // результат: 4 short t 1 = 3, t 2 = 4; int y = Max( t 1, t 2 ); // аргументы совместимого типа Console. Write. Line( y ); // результат: 4 int z = Max(a + t 1, t 1 / 2 * b); // аргументы-выражения Console. Write. Line( z ); // результат: 5 }} ©Павловская Т. А. (НИУ ИТМО) 30

Способы передачи аргументов в метод Аргументы передаются: n n По значению По адресу (ссылке) Способы передачи аргументов в метод Аргументы передаются: n n По значению По адресу (ссылке) n При передаче по значению метод получает копии значений аргументов, и операторы метода работают с этими копиями. n При передаче по ссылке (по адресу) метод получает копии адресов аргументов и осуществляет доступ к аргументам по этим адресам.

Типы параметров В С# четыре типа параметров: n параметры-значения - для исходных данных метода; Типы параметров В С# четыре типа параметров: n параметры-значения - для исходных данных метода; n параметры-ссылки (ref) - для изменения аргумента; n выходные параметры (out) – для формирования аргумента; n параметры-массивы (params) – для переменного кол-ва аргументов. по адресу Пример: public int Calculate( int a, ref int b, out int c, params int[] d ) { … параметрзначение параметрссылка ©Павловская Т. А. (НИУ ИТМО) выходной параметрмассив 32

Передача аргумента по значению копия аргумента область параметров аргумент код метода n. При вызове Передача аргумента по значению копия аргумента область параметров аргумент код метода n. При вызове метода на месте параметра, передаваемого по значению, может находиться выражение (а также его частные случаи — переменная или константа). n. Должно существовать неявное преобразование типа выражения к типу параметра. double a = 0. 1; double b = Math. Sin(a); double c = Math. Sin(b-2*a); static int Max(int a, int b) { … } … int x = Max(3, z);

class Counter Пример: счетчик { public void Inc(int delta) { n += delta; } class Counter Пример: счетчик { public void Inc(int delta) { n += delta; } public override string To. String() { return n. To. String(); } int n; } class Program { static void Main(string[] args) { Counter num = new Counter(); num. Inc(4); Передача по значению int a = 3; num. Inc(2*a); Console. Write. Line("значение счетчика " + num); }} ©Павловская Т. А. (НИУ ИТМО) 34

Передача аргумента по ссылке (ref, out) адрес аргумента область параметров аргумент n. При вызове Передача аргумента по ссылке (ref, out) адрес аргумента область параметров аргумент n. При вызове метода на месте параметра-ссылки ref код метода может находиться только имя инициализированной переменной точно того же типа. Перед именем параметра указывается ключевое слово ref. n. При вызове метода на месте выходного параметра out может находиться только имя переменной точно того же типа. Ее инициализация не требуется. Перед именем параметра указывается ключевое слово out. int Some. Method(ref int a, out int b) { … } … int s = 0; int z; int x = Some. Method(ref s, out z);

Пример: параметры-значения и ссылки ref using System; namespace Console. Application 1 { class Class Пример: параметры-значения и ссылки ref using System; namespace Console. Application 1 { class Class 1 { static void P( int a, ref int b ) { a = 44; b = 33; Console. Write. Line( "внутри метода {0} {1}", a, b ); } static void Main() { int a = 2, b = 4; Console. Write. Line( "до вызова {0} {1}", a, b ); P( a, ref b ); Console. Write. Line( "после вызова {0} {1}", a, b ); }}} Результат работы программы: до вызова 2 4 внутри метода 44 33 после вызова 2 33 ©Павловская Т. А. (НИУ ИТМО) 36

Пример: выходные параметры out using System; namespace Console. Application 1 { class Class 1 Пример: выходные параметры out using System; namespace Console. Application 1 { class Class 1 { static void P( int x, out int y ) { x = 44; y = 33; Console. Write. Line( "внутри метода {0} {1}", x, y ); } static void Main() { int a = 2, b; // инициализация b не требуется P( a, out b ); Console. Write. Line( "после вызова {0} {1}", a, b ); }}} Результат работы программы: внутри метода 44 33 после вызова 2 33 ©Павловская Т. А. (НИУ ИТМО) 37

class Counter Пример: счетчик (параметр out) { public bool Sync(out int x) { x class Counter Пример: счетчик (параметр out) { public bool Sync(out int x) { x = n; return n==0 ? false : true ; Плохой стиль } public void Set( int start ) { n = start; } int n; . . . } class Program { static void Main(string[] args) { Counter num 1 = new Counter(); Counter num 2 = new Counter(); . . . int temp; if ( num 1. Sync(out temp) ) num 2. Set(temp); … ©Павловская Т. А. (НИУ ИТМО) 38

Summary: Правила применения параметров 1. Для параметров-значений используется передача по значению. Этот способ применяется Summary: Правила применения параметров 1. Для параметров-значений используется передача по значению. Этот способ применяется для исходных данных метода. n При вызове метода на месте аргумента параметра-значения может быть выражение (а также его частные случаи — переменная или константа). Должно существовать неявное преобразование типа выражения к типу параметра. 2. Параметры-ссылки и выходные параметры передаются по адресу. Этот способ применяется для передачи побочных результатов метода. n При вызове метода на месте аргумента параметра-ссылки ref может находиться только имя инициализированной переменной точно того же типа. Перед именем параметра и аргумента указывается ключевое слово ref. n При вызове метода на месте выходного параметра out может находиться только имя переменной точно того же типа. Ее инициализация не требуется. Перед именем параметра и аргумента указывается ключевое слово out. ©Павловская Т. А. (НИУ ИТМО) 39

Методы с переменным количеством аргументов class Class 1 { public static double Average( params Методы с переменным количеством аргументов class Class 1 { public static double Average( params int[] a ) { if ( a. Length == 0 ) throw new Exception( "Недостаточно аргументов"); double sum = 0; foreach ( int elem in a ) sum += elem; return sum / a. Length; } static void Main() { try { short z = 1, e = 13, w = 4; Console. Write. Line( Average( z, e, w ) ); // 6 byte v = 18; Console. Write. Line( Average( z, e, w, v) ); // 9 int[] b = { -11, -4, 12, 14, 32, -1, 28 }; Console. Write. Line( Average( b ) ); // 38 Console. Write. Line( Average() ); // Недостаточно аргументов } catch( Exception e ) { Console. Write. Line( e. Message ); return; } catch { Console. Write. Line( "ой-кшмр" ); return; } }} 40 ©Павловская Т. А. (НИУ ИТМО)

Рекурсивные методы n n Рекурсивным называется метод, который вызывает сам себя (прямая рекурсия). Косвенная Рекурсивные методы n n Рекурсивным называется метод, который вызывает сам себя (прямая рекурсия). Косвенная рекурсия - когда два или более метода вызывают друга. Для завершения вычислений каждый рекурсивный метод должен содержать хотя бы одну нерекурсивную ветвь алгоритма, заканчивающуюся оператором возврата. стек long fact( long n ) { if ( n == 0 || n == 1 ) return 1; // нерекурсивная ветвь return ( n * fact( n – 1 ) ); // рекурсивная ветвь } n = 1 … … long m = fact(4); n = 2 … n = 3 … // или: n = 4 … long fact( long n ) { return ( n > 1 ) ? n * fact( n – 1 ) : 1; } ©Павловская Т. А. (НИУ ИТМО) 41

Характеристики рекурсии Достоинство рекурсии: компактность записи. Недостатки: опасность переполнения стека; расход времени и памяти Характеристики рекурсии Достоинство рекурсии: компактность записи. Недостатки: опасность переполнения стека; расход времени и памяти на повторные вызовы метода и передачу ему копий параметров. Рекурсивные методы используются в основном для работы с рекурсивными структурами данных, например, бинарными деревьями.

Ключевое слово this Чтобы обеспечить работу метода с полями того объекта, для которого он Ключевое слово this Чтобы обеспечить работу метода с полями того объекта, для которого он был вызван, в метод автоматически передается скрытый параметр this, в котором хранится ссылка на вызвавший функцию объект. КОД: Метод Main: Monster a = new… Monster b = new… a. Passport() b. Passport() this=a Метод Passport: Вывод полей name this. name health this. health ammo this. ammo ©Павловская Т. А. (НИУ ИТМО) this=b ДАННЫЕ (хип): Объект a: name health ammo Объект b: name health ammo 43

Использование явного this В явном виде параметр this применяется: 1) чтобы возвратить из метода Использование явного this В явном виде параметр this применяется: 1) чтобы возвратить из метода ссылку на вызвавший объект: class Demo { double y; public Demo T() { return this; } // 2) для идентификации поля, если его имя совпадает с // именем параметра метода: public void Set_y( double y ) { this. y = y; } } ©Павловская Т. А. (НИУ ИТМО) 44

Пример: счетчик (this) class Counter { public bool Sync(out int x) { x = Пример: счетчик (this) class Counter { public bool Sync(out int x) { x = n; return n==0 ? false : true ; } public void Set( int start ) { n = start; } int n; . . . } public void Set( int n ) { this. n = n; } class Program { static void Main(string[] args) { Counter num 1 = new Counter(); Counter num 2 = new Counter(); . . . int temp; if ( num 1. Sync(out temp) ) num 2. Set(temp); … ©Павловская Т. А. (НИУ ИТМО) 45

Конструкторы Конструктор – особый вид метода, предназначенный для инициализации n объекта (конструктор экземпляра) или Конструкторы Конструктор – особый вид метода, предназначенный для инициализации n объекта (конструктор экземпляра) или n класса (статический конструктор). Конструктор экземпляра инициализирует данные экземпляра, конструктор класса — данные класса. ©Павловская Т. А. (НИУ ИТМО) 46

Конструкторы экземпляра Конструктор вызывается автоматически при создании объекта класса с помощью операции new. Имя Конструкторы экземпляра Конструктор вызывается автоматически при создании объекта класса с помощью операции new. Имя конструктора совпадает с именем класса. Свойства конструкторов n Конструктор не возвращает значение, даже типа void. n Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации. n Если программист не указал ни одного конструктора или какие-то поля не были инициализированы, полям значимых типов присваивается нуль, полям ссылочных типов — значение null. n Конструктор, вызываемый без параметров, называется конструктором по умолчанию. ©Павловская Т. А. (НИУ ИТМО) 47

Пример класса с конструктором class Demo { public Demo( int a, double y ) Пример класса с конструктором class Demo { public Demo( int a, double y ) // конструктор { this. a = a; this. y = y; } int a; double y; } class Class 1 { static void Main() { Demo a = new Demo( 300, 0. 002 ); // вызов конструктора Demo b = new Demo( 1, 5. 71 ); // вызов конструктора … } } ©Павловская Т. А. (НИУ ИТМО) 48

Пример класса с двумя конструкторами class Demo { public Demo( int a ) // Пример класса с двумя конструкторами class Demo { public Demo( int a ) // конструктор 1 { this. a = a; this. y = 0. 002; } public Demo( double y ) // конструктор 2 { this. a = 1; this. y = y; } . . . Demo x = new Demo( 300 ); // вызов конструктора 1 Demo y = new Demo( 5. 71 ); // вызов конструктора 2 ©Павловская Т. А. (НИУ ИТМО) 49

class Counter Пример: счетчик (конструкторы) { public Counter() { } public Counter( int n class Counter Пример: счетчик (конструкторы) { public Counter() { } public Counter( int n ) public Counter( int n = 0) { this. n = n > 0 ? n : 0; } int n; . . . } class Program { static void Main(string[] args) { Counter num 1 = new Counter(); Counter num 2 = new Counter(128); . . . } } ©Павловская Т. А. (НИУ ИТМО) 50

Сквозной пример класса – 1/2 public int Health { // свойство class Monster { Сквозной пример класса – 1/2 public int Health { // свойство class Monster { get { return health; } Monster Vasia = new Monster(); public Monster() // конструктор set { if (value > 0) health = value; Monster Petya = new Monster(“Петя“); { else health = 0; } name = "Noname"; Monster Masha = new Monster(“Мария”, 150, 3000); } health = 100; ammo = 100; public void Passport() // метод } { Console. Write. Line( public Monster( string name ) : this() "Monster {0} t health = {1} { ammo = {2}", name, health, ammo ); this. name = name; } } public override string To. String(){ public Monster(string name, int health, string buf = string. Format( int ammo) "Monster {0} t health = {1} { ammo = {2}", name, health, ammo); this. name = name; return buf; } this. health = health > 0 ? health : 0 ; this. ammo = ammo > 0 ? ammo : 0 ; string name; } int health, ammo; public string Get. Name() // метод } { return name; } public int Get. Ammo() // метод { return ammo; } ©Павловская Т. А. (НИУ ИТМО) 51

Сквозной пример класса – 2/2 class Monster { public Monster(string name = Сквозной пример класса – 2/2 class Monster { public Monster(string name = "Noname", int health = 100, int ammo = 100) { this. name = name; this. health = health > 0 ? health : 0 ; this. ammo = ammo > 0 ? ammo : 0 ; } public string Get. Name() // метод { return name; } public int Get. Ammo() // метод { return ammo; } Monster Vasia = new Monster(); Monster Petya = new Monster(“Петя“); public int Health { // свойство get { return health; } set { if (value > 0) health = value; else health = 0; } } public void Passport() // метод { Console. Write. Line( "Monster {0} t health = {1} ammo = {2}", name, health, ammo ); } public override string To. String(){ string buf = string. Format( "Monster {0} t health = {1} ammo = {2}", name, health, ammo); return buf; } string name; int health, ammo; } Monster Masha = new Monster(“Мария”, 150, 3000); ©Павловская Т. А. (НИУ ИТМО) 52

Статические конструкторы n Статический конструктор (конструктор класса) инициализирует статические поля класса. n Он не Статические конструкторы n Статический конструктор (конструктор класса) инициализирует статические поля класса. n Он не имеет параметров, его нельзя вызвать явным образом. Система сама определяет момент, в который требуется его выполнить. Гарантируется, что это происходит до создания первого экземпляра объекта и до вызова любого статического метода. n Статический конструктор, как и любой статический метод, не имеет доступа к полям экземпляра. ©Павловская Т. А. (НИУ ИТМО) 53

Пример класса со статическими элементами class Monster { public Monster(string name = Пример класса со статическими элементами class Monster { public Monster(string name = "Noname", int health = 100, int ammo = 100) { this. name = name; Monster Vasia = new Monster(); this. health = health > 0 ? health : 0 ; Monster Petya = new Monster("Петя"); this. ammo = ammo > 0 ? ammo : 0 ; Monster Masha = new Monster("Мария“, 150, 300); ++num_Monsters; } Console. Write. Line(Monster. Total()); // 3 } static Monster() { num_Monsters = 0; } // избыточно, для примера public static int Total() { return num_Monsters; } . . . string name; int health, ammo; static int num_Monsters = 0; } ©Павловская Т. А. (НИУ ИТМО) 54

Любой человек должен уметь менять пеленки, планировать вторжения, резать свиней, конструировать здания, управлять кораблями, Любой человек должен уметь менять пеленки, планировать вторжения, резать свиней, конструировать здания, управлять кораблями, писать сонеты, вести бухгалтерию, возводить стены, вправлять кости, облегчать смерть, исполнять приказы, отдавать приказы, сотрудничать, действовать самостоятельно, решать уравнения, анализировать новые проблемы, бросать навоз, программировать компьютеры, вкусно готовить, хорошо сражаться, достойно умирать. Специализация — удел насекомых. Роберт Хайнлайн

Свойства n Свойства служат для организации доступа к полям класса. Как правило, свойство определяет Свойства n Свойства служат для организации доступа к полям класса. Как правило, свойство определяет методы доступа к закрытому полю. n Свойства обеспечивают разделение между внутренним состоянием объекта и его интерфейсом. n Синтаксис свойства: [ спецификаторы ] тип имя_свойства { [ get код_доступа ] [ set код_доступа ] } При обращении к свойству автоматически вызываются указанные в нем блоки чтения (get) и установки (set). n Может отсутствовать либо часть get, либо set, но не обе одновременно. Если отсутствует часть set, свойство доступно только для чтения (read-only), если отсутствует get - только для записи (write-only). ©Павловская Т. А. (НИУ ИТМО) 56

class Counter Пример: счетчик (свойства) { public Counter( int n = 0 ) { class Counter Пример: счетчик (свойства) { public Counter( int n = 0 ) { this. n = n > 0 ? n : 0; } public int N { get { return n; } set { n = value > 0 ? value : 0; } // или: set { if (value > 0) n = value; else throw new Exception(); } int n; // поле, связанное со свойством N } class Program { static void Main(string[] args) { Counter num = new Counter(); num. N = 5; // работает set int a = num. N; // работает get num. N++; // работает get, а потом set ++num. N; // работает get, а потом set }} ©Павловская Т. А. (НИУ ИТМО) 57

Еще пример описания свойств public class Button: Control { private string caption; // поле, Еще пример описания свойств public class Button: Control { private string caption; // поле, с которым связано свойство public string Caption { // свойство get { return caption; } // способ получения свойства set // способ установки свойства { if (caption != value) { caption = value; } }} . . . В программе свойство выглядит как поле класса: Button ok = new Button(); ok. Caption = "OK"; // вызывается метод установки свойства string s = ok. Caption; // вызывается метод получения свойства ©Павловская Т. А. (НИУ ИТМО) 58

Сквозной пример класса: свойства class Monster { public Monster(string name = Сквозной пример класса: свойства class Monster { public Monster(string name = "Noname", int health = 100, int ammo = 100) { this. name = name; this. health = health > 0 ? health : 0 ; this. ammo = ammo > 0 ? ammo : 0 ; } public string Get. Name() // метод { return name; } public int Get. Ammo() // метод { return ammo; } public int Health { // свойство get { return health; } set {health = value > 0 ? value : 0; } } public string Name { // свойство get { return name; } } public void Passport() // метод { Console. Write. Line( "Monster {0} t health = {1} ammo = {2}", name, health, ammo ); } public override string To. String(){ string buf = string. Format( "Monster {0} t health = {1} ammo = {2}", name, health, ammo); return buf; } string name; int health, ammo; } ©Павловская Т. А. (НИУ ИТМО) 59

Пример вычисляемых свойств namespace Console. Application 1 { class Ball { public Ball(double radius, Пример вычисляемых свойств namespace Console. Application 1 { class Ball { public Ball(double radius, double density) { this. radius = radius; this. density = density; } public double Mass class Program { get { return radius * density; } } { static void Main(string[] args) public double Diameter { get { return radius * 2; } } Ball ball = new Ball(10, 6. 2); Console. Write. Line("Диаметр: " + double radius; ball. Diameter + double density; " Масса: " + ball. Mass); } }

Перегрузка методов Перегрузкой методов называется использование нескольких методов с одним и тем же именем, Перегрузка методов Перегрузкой методов называется использование нескольких методов с одним и тем же именем, но различными типами параметров. n Компилятор определяет, какой именно метод требуется вызвать, по типу фактических параметров. Это называется разрешением (resolution) перегрузки. // Возвращает наибольшее из двух целых: int max( int a, int b ) // Возвращает наибольшее из трех целых: int max( int a, int b, int c ) // Возвращает наибольшее из первого параметра // и длины второго: int max ( int a, string b ). . . Console. Write. Line( max( 1, 2 ) ); Console. Write. Line( max( 1, 2, 3 ) ); Console. Write. Line( max( 1, "2" ) ); n Перегрузка методов является проявлением полиморфизма n ©Павловская Т. А. (НИУ ИТМО) 61

class Counter Пример: счетчик (перегрузка) { public Counter() { } public Counter( int n class Counter Пример: счетчик (перегрузка) { public Counter() { } public Counter( int n ) { this. n = n > 0 ? n : 0; } Перегруженные конструкторы public void Inc() { ++n; } public void Inc( int delta ){ n += Math. Abs(delta); } int n; . . . } Перегруженные методы class Program { static void Main(string[] args) { Counter num 1 = new Counter(); Counter num 2 = new Counter(128); num 1. Inc(4); num 1. Inc(); . . . } ©Павловская Т. А. (НИУ ИТМО) 62

Сквозной пример класса class Monster { public Monster() // конструктор { this. name = Сквозной пример класса class Monster { public Monster() // конструктор { this. name = "Noname"; this. health = 100; this. ammo = 100; } public Monster( string name ) : this() { this. name = name; } public Monster( int health, int ammo, string name ) { this. name = name; this. health = health; this. ammo = ammo; } public string Get. Name() // метод { return name; } public int Get. Ammo() // метод { return ammo; } ©Павловская Т. А. (НИУ ИТМО) public int Health { // свойство get { return health; } set { if (value > 0) health = value; else health = 0; } } public void Passport() // метод { Console. Write. Line( "Monster {0} t health = {1} ammo = {2}", name, health, ammo ); } public override string To. String(){ string buf = string. Format( "Monster {0} t health = {1} ammo = {2}", name, health, ammo); return buf; } string name; int health, ammo; } 63

Операции класса (перегрузка операций) n В С# можно переопределить для своих классов действие большинства Операции класса (перегрузка операций) n В С# можно переопределить для своих классов действие большинства операций. Это позволяет применять экземпляры объектов в составе выражений аналогично переменным стандартных типов: My. Object a, b, c; . . . c = a + b; // операция сложения класса My. Object n Определение собственных операций класса называют перегрузкой операций. n Операции класса описываются с помощью методов специального вида (функций-операций): public static имя_класса operator операция( параметры) {… } Пример: public static My. Object operator --( My. Object m ) { … } В C# три вида операций класса: унарные, бинарные и операции преобразования типа. ©Павловская Т. А. (НИУ ИТМО) 64

Общие правила описания операций класса n операция должна быть описана как открытый статический метод Общие правила описания операций класса n операция должна быть описана как открытый статический метод класса (спецификаторы public static); n параметры в операцию должны передаваться по значению (то есть не должны предваряться ключевыми словами ref или out); n сигнатуры всех операций класса должны различаться; n типы, используемые в операции, должны иметь не меньшие права доступа, чем сама операция (то есть должны быть доступны при использовании операции).

Унарные операции Можно определять: + - ! ~ ++ -- true false Примеры заголовков: Унарные операции Можно определять: + - ! ~ ++ -- true false Примеры заголовков: public static int operator +( My. Object m ) // унарный плюс public static My. Object operator --( My. Object m ) // декремент class Monster { public static Monster operator ++(Monster m) { Monster temp = new Monster(m. health+1, m. ammo, m. name); return temp; } … } … Monster vasia = new Monster(); ++vasia; vasia++; … 66 ©Павловская Т. А. (НИУ ИТМО)

class Counter Пример: счетчик (операция ++) { public Counter( int n = 0 ) class Counter Пример: счетчик (операция ++) { public Counter( int n = 0 ) { this. n = n > 0 ? n : 0; } public static Counter operator ++(Counter param) { Counter temp = new Counter(param. n + 1); return temp; } int n; } class Program { static void Main(string[] args) { Counter num = new Counter(); num++; ++num; . . . } } ©Павловская Т. А. (НИУ ИТМО) 67

Правила оформления унарной операции класса n Параметр функции-операции должен иметь тип этого класса. n Правила оформления унарной операции класса n Параметр функции-операции должен иметь тип этого класса. n Операция должна возвращать: n n для операций +, -, ! и ~ величину любого типа; для операций ++ и -- величину типа класса, для которого она определяется. n Операции не должны изменять значение передаваемого им операнда. Операция, возвращающая величину типа класса, для которого она определяется, должна создать новый объект этого класса, выполнить с ним необходимые действия и передать его в качестве результата. n Префиксный и постфиксный инкремент/декремент не различаются ©Павловская Т. А. (НИУ ИТМО) 68

Бинарные операции Можно определять: + - * / % & | ^ << >> Бинарные операции Можно определять: + - * / % & | ^ << >> == != > < >= <= Примеры заголовков бинарных операций: public static My. Object operator + ( My. Object m 1, My. Object m 2 ) public static bool operator == ( My. Object m 1, My. Object m 2 ) n n n Хотя бы один параметр, передаваемый в операцию, должен иметь тип класса, для которого она определяется. Операция может возвращать величину любого типа. Чаще всего в классе определяют операции сравнения на равенство и неравенство для того, чтобы обеспечить сравнение объектов, а не их ссылок. Операции == и !=, > и <, >= и <= определяются только парами и обычно возвращают логическое значение. ©Павловская Т. А. (НИУ ИТМО) 69

Пример бинарных операций класса class Monster { public static Monster operator +( Monster m, Пример бинарных операций класса class Monster { public static Monster operator +( Monster m, int k ) { Monster temp = new Monster(m. health+k, m. ammo, m. name); return temp; } public static Monster operator +( int k, Monster m ) { Monster temp = new Monster(m. health+k, m. ammo, m. name); return temp; } … } … Monster vasia = new Monster(); Monster masha = vasia + 10; Monster petya = 5 + masha; … ©Павловская Т. А. (НИУ ИТМО) 70

class Counter Пример: счетчик (операция +) { . . . public static Counter operator class Counter Пример: счетчик (операция +) { . . . public static Counter operator +(Counter param, int delta) { Counter temp = new Counter(param. n + delta); return temp; } public static Counter operator +(int delta, Counter param) { Counter temp = new Counter(param. n + delta); return temp; } int n; } class Program { static void Main(string[] args) { Counter num = new Counter(); Counter num 2 = new Counter(); num 2 = num + 3; num 2 = 3 + num; . . . ©Павловская Т. А. (НИУ ИТМО) 71

Операции преобразования типа Обеспечивают возможность явного и неявного преобразования между пользовательскими типами данных. implicit Операции преобразования типа Обеспечивают возможность явного и неявного преобразования между пользовательскими типами данных. implicit operator тип ( параметр ) // неявное преобразование explicit operator тип ( параметр ) // явное преобразование Выполняют преобразование из типа параметра в тип, указанный в заголовке операции. Одним из этих типов должен быть класс, для которого определяется операция. Таким образом, операции выполняют преобразование либо типа класса к другому типу, либо наоборот. public static implicit operator int( Monster m ) { return m. health; } public static explicit operator Monster( int h ) { return new Monster( h, 100, "From. Int" ); }. . . Monster Masha = new Monster( 200, "Masha" ); int i = Masha; // неявное преобразование Masha = (Monster) 500; // явное преобразование ©Павловская Т. А. (НИУ ИТМО) 72

class Counter Пример: счетчик (приведение типа) { . . . public static implicit operator class Counter Пример: счетчик (приведение типа) { . . . public static implicit operator int(Counter param) { return param. n; } public static implicit operator Counter(int n) { return new Counter(n); } int n; } class Program { static void Main(string[] args) { Counter num = new Counter(); int a = num; num = 4; a = num + 3; ; . . . } ©Павловская Т. А. (НИУ ИТМО) 73

Применение операций преобразования n Неявное преобразование выполняется автоматически: n n при использовании объекта в Применение операций преобразования n Неявное преобразование выполняется автоматически: n n при использовании объекта в выражении, содержащем переменные целевого типа; n при передаче объекта в метод на место параметра целевого типа; n n присваивании объекта переменной целевого типа; при явном приведении типа. Явное преобразование выполняется при использовании операции приведения типа, например: n int a = (int) имя_объекта; ©Павловская Т. А. (НИУ ИТМО) 74

Summary ©Павловская Т. А. (НИУ ИТМО) 75 Summary ©Павловская Т. А. (НИУ ИТМО) 75

Интерфейс класса n При создании класса следует хорошо продумать его интерфейс — средства работы Интерфейс класса n При создании класса следует хорошо продумать его интерфейс — средства работы с классом, доступные использующим его программистам. n Интерфейс хорошо спроектированного класса интуитивно ясен, непротиворечив и обозрим. Как правило, он не должен включать поля данных. n В идеале интерфейс должен быть полным (предоставлять возможность выполнять любые разумные действия с классом) и минимально необходимым (без дублирования и пересечения возможностей методов). ©Павловская Т. А. (НИУ ИТМО) 76

Состав класса n Как правило, класс как тип, определенный пользователем, должен содержать скрытые (private) Состав класса n Как правило, класс как тип, определенный пользователем, должен содержать скрытые (private) поля и следующие функциональные элементы: n конструкторы, определяющие, как инициализируются объекты класса; n набор методов и свойств, реализующих характеристики класса; n классы исключений, используемые для сообщений об ошибках путем генерации исключительных ситуаций. n Классы, моделирующие математические или физические понятия, обычно также содержат набор операций, позволяющих копировать, присваивать, сравнивать объекты и производить с ними другие действия, требующиеся по сути класса. ©Павловская Т. А. (НИУ ИТМО) 77

Пример: опять снова счетчик class Counter { int n; // скрытое поле класса public Пример: опять снова счетчик class Counter { int n; // скрытое поле класса public class Invalid. Counter. Value : Exception { } // класс исключения public Counter(int n) { // конструктор if (n >= 0) this. n = n; else throw new Invalid. Counter. Value(); } public override string To. String() // переопределение метода предка { return n. To. String(); } public static Counter operator ++(Counter param) // ариф. операции { Counter temp = new Counter(param. n + 1); return temp; } public static Counter operator +(Counter param, int delta) { Counter temp = new Counter(param. n + delta); return temp; } public static Counter operator +(int delta, Counter param) { Counter temp = new Counter(param. n + delta); return temp; } public static Counter operator +(Counter param 1, Counter param 2) { Counter temp = new Counter(param 1. n + param 2. n); return temp; } ©Павловская Т. А. (НИУ ИТМО) 78

 public static implicit operator int(Counter param) // операции { return param. n; } public static implicit operator int(Counter param) // операции { return param. n; } /* Counter в int */ // преобразования public static implicit operator Counter(int n) { return new Counter(n); } /* int в Counter */ public int N // свойство { get { return n; } set { if (value >= 0) n = value; else throw new Invalid. Counter. Value(); }} public void Inc(int delta){ n += Math. Abs(delta); } // методы public void Inc() { ++n; } } class Program { static void Main(string[] args) // класс-клиент { try { Counter num = new Counter(); Counter num 2 = new Counter(10); num++; num 2 += 5; int a = num + num 2; int b = num; num = 4; a = num + 3; num = b - a; Console. Write(num); } catch (Counter. Invalid. Counter. Value) { Console. Write. Line("Недопустимое значение счетчика"); } catch { Console. Write. Line( «Какое-то исключение"); } } } ©Павловская Т. А. (НИУ ИТМО) 79

Элементы класса n Методы определяют поведение класса. Каждый метод класса должен решать только одну Элементы класса n Методы определяют поведение класса. Каждый метод класса должен решать только одну задачу. n Создание любого метода следует начинать с его интерфейса (заголовка). Необходимо четко представлять себе, какие параметры метод должен получать и какие результаты формировать. Входные параметры обычно перечисляют в начале списка параметров. n Поля, характеризующие класс в целом, следует описывать как статические. n Все литералы, связанные с классом, описываются как поля -константы с именами, отражающими их смысл. n Необходимо стремиться к максимальному сокращению области действия каждой переменной. Это упрощает отладку программы, поскольку ограничивает область поиска ошибки. ©Павловская Т. А. (НИУ ИТМО) 80

 «Приведем аналогию с шахматами. Взрослому человеку нужно 5 минут, чтобы запомнить правила (как «Приведем аналогию с шахматами. Взрослому человеку нужно 5 минут, чтобы запомнить правила (как ходят/бьют пешки и фигуры, правила рокировки и пр. ), а для того чтобы стать мастером игры, нужны сотни сыгранных партий. » Роман Савин. Тестирование dot com, или Пособие по жестокому обращению с багами в интернет-стартапах. — М. : «Дело» , 2007 ©Павловская Т. А. (НИУ ИТМО) 81

БАРС: расчет рейтинга по модулю 2 Вид учебной нагрузки баллы min max Вып. лаб. БАРС: расчет рейтинга по модулю 2 Вид учебной нагрузки баллы min max Вып. лаб. работ (3 штуки) 3 * 3 шт = 9 5 * 3 шт = 15 Рубежный контроль (защита лабораторных) 6 10 Тестирование в ЦДО 5 8 Личностные качества 3 5 Экзамен 12 20 Итог 35 58 Т. А. Павловская (НИУ ИТМО) 82

Лабораторные работы в модуле 2 I. Простейшие классы класс должен содержать конструктор по умолчанию, Лабораторные работы в модуле 2 I. Простейшие классы класс должен содержать конструктор по умолчанию, конструктор(ы) с параметрами, методы, свойства, переопределенный метод To. String, . . . II. Одномерные массивы n n весь вывод – только в Main! n III. оформлять каждый пункт задания в виде отдельного метода, формирующего требуемый результат обрабатывать все особые случаи Двумерные массивы n n весь вывод – только в Main! n IV. оформлять каждый пункт задания в виде отдельного метода, формирующего требуемый результат обрабатывать все особые случаи Личностные качества: доп. л/р на строки (!!!) ©Павловская Т. А. (НИУ ИТМО) 83

n Домашнее задание: читать главу 5 и разделы главы 7 (перегрузка, рекурсия, операции) до n Домашнее задание: читать главу 5 и разделы главы 7 (перегрузка, рекурсия, операции) до просветления n Попытаться реализовать все изученные элементы класса в лабораторной работе № 4 ©Павловская Т. А. (НИУ ИТМО) 84