# data[].attributes.headline
C# объектно-ориентированное программирование

# data[].attributes.subject
C# объектно-ориентированное программирование

# data[].attributes.body
План Работы
■Определение понятия «класс»

■3 столпа ООП (определения)

■Их реализация в С#:

■Инкапсуляция

■Наследование

■Полиморфизм

■Жизненный цикл объектов

# data[].attributes.headline
  Определение : Класс 

# data[].attributes.subject
  Определение : Класс 

# data[].attributes.body
Класс – пользовательский тип данных, который состоит из данных и функций для выполнения действий с этими данными.

# data[].attributes.body
К примеру, нам потребовалось создать модель сотрудника некоторой организации

# data[].attributes.headline
Указание области видимости на уровне типа:

# data[].attributes.subject
Указание области видимости на уровне типа:

# data[].attributes.body
Атрибут видимости м.б. установлен для любого типа С#: класса, структуры, перечисления, интерфейса и делегата.

# data[].attributes.headline
3 важнейших принципа ООП:

# data[].attributes.subject
3 важнейших принципа ООП:

# data[].attributes.headline
Инкапсуляция:

# data[].attributes.subject
Инкапсуляция:

# data[].attributes.body
Как объекты прячут свое   внутреннее устройство
Инкапсуляция:  способность скрывать детали объекта от пользователя.

«Всё что может быть private должно быть private»

# data[].attributes.headline
Наследование:	

# data[].attributes.subject
Наследование:	

# data[].attributes.body
как поддерживается   повторное   использование кода
Наследование:  возможность использовать уже созданный(базовый) класс для того чтобы делать расширенные классы. У которых те же атрибуты и методы, что и у базового + свои.

# data[].attributes.headline
Полиморфизм:

# data[].attributes.subject
Полиморфизм:

# data[].attributes.body
как реализована поддержка   выполнения нужного действия в   зависимости от типа   передаваемого объекта
Полиморфизм: (Poly = много, morph = форма)     то, как классы, унаследованные от одного базового, выполняют методы своего класса-родителя.

■Каждый по-своему

■Как в базовом

■Частично как в базовом + особенности и т.д.

# data[].attributes.headline
Как  использовать  в  языке  программирования ?

# data[].attributes.subject
Как  использовать  в  языке  программирования ?

# data[].attributes.headline
Инкапсуляция

# data[].attributes.subject
Инкапсуляция

# data[].attributes.body
Принцип инкапсуляции предполагает, что ко внутренним данным объекта нельзя обратиться напрямую через экземпляр этого объекта.

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

# data[].attributes.body
Пусть у нас переменная, отвечающая за количество страниц в книге будет открытой, объявлена с ключевым словом public.

Тогда возникает проблема: полю можно присвоить любое значение, а организовать проверку этого значения в основном коде достаточно сложно.

Например, тут используется тип данных int. Максимальное значение для этого типа - достаточно большое число (2 147 483 647). Если в программе будет такой код, проблем со стороны компилятора не возникнет:
А можем и вообще отрицательное число страниц задать…

# data[].attributes.headline
Продолжение примера:

# data[].attributes.subject
Продолжение примера:

# data[].attributes.body
Чтобы решить проблему нужно сделать это поле закрытым (private или

protected), а для обращения к нему воспользоваться одним из двух способов:
. Создать традиционную пару методов – один для чтения переменной а второй для её изменения:

# data[].attributes.headline
Наследование:

# data[].attributes.subject
Наследование:

# data[].attributes.headline
Классическое наследование в C#:

# data[].attributes.subject
Классическое наследование в C#:

# data[].attributes.body
Некоторые замечания:

■Указатель на базовый класс  «:»

■Наследуются только ОТКРЫТЫЕ и PROTECTED члены базового класса

■Нельзя производить наследование от нескольких базовых классов

# data[].attributes.headline
 Запрет наследования:

# data[].attributes.subject
 Запрет наследования:

# data[].attributes.body
Для запрещения наследования предусмотрено ключевое слово sealed

# data[].attributes.headline
Полиморфизм:

# data[].attributes.subject
Полиморфизм:

# data[].attributes.body
Метод в базовом классе, который будет переопределен должен быть объявлен как виртуальный ( ключевое слово virtual)

Переопределяя виртуальный метод в производном классе, мы заново определяем его, используя ключевое слово override

Если не переопределяем, реализуется как в базовом

# data[].attributes.headline
Абстрактные классы и методы:

# data[].attributes.subject
Абстрактные классы и методы:

# data[].attributes.body
Абстрактные методы могут быть в базовом классе без реализации по умолчанию. Каждый производный класс обязан самостоятельно определить этот метод.

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

# data[].attributes.headline
Жизненный цикл объекта:

# data[].attributes.subject
Жизненный цикл объекта:

# data[].attributes.body
■Создание: используется ключевое слово new, обращаемся к конструктору объекта.

■Уничтожение: обращаемся к деструктору.

Вопрос: как понять, что объект больше не нужен?
Ответ: Удаляем объект из памяти когда в текущей   области видимости на него  больше нет активных   ссылок.

Удаление делается автоматически средой выполнения .NET
Когда заканчивается место в управляемой куче, запускается сборщик мусора.
Сначала деструктор, потом физическое удаление из памяти.

# data[].attributes.headline
Если  вопросы  напишите  

# data[].attributes.subject
Если  вопросы  напишите  