C#, объектно-ориентированное программирование

Содержание

Слайд 2

План доклада Определение понятия «класс» 3 столпа ООП (определения) Их реализация

План доклада

Определение понятия «класс»
3 столпа ООП (определения)
Их реализация в С#:
Инкапсуляция
Наследование
Полиморфизм
Жизненный цикл

объектов
Слайд 3

Формальное определение класса в С# Класс – пользовательский тип данных, который

Формальное определение класса в С#

Класс – пользовательский тип данных, который состоит

из данных и функций для выполнения действий с этими данными.
Слайд 4

К примеру, нам потребовалось создать модель сотрудника некоторой организации

К примеру, нам потребовалось создать модель сотрудника некоторой организации

Слайд 5

Указание области видимости на уровне типа: class public internal Могут быть

Указание области видимости на уровне типа:

class

public

internal

Могут быть созданы и из своего

двоичного файла и из других двоичных файлов.

(по умолчанию)
Могут быть созданы только из той сборки, в которой были определены.

public class Employee
{
...
}

internal class Employee
{
...
}

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

Слайд 6

3 важнейших принципа ООП: Инкапсуляция: как объекты прячут свое внутреннее устройство;

3 важнейших принципа ООП:

Инкапсуляция: как объекты прячут свое внутреннее устройство;

Наследование: как поддерживается повторное

использование кода;

Полиморфизм: как реализована поддержка выполнения нужного действия в зависимости от типа передаваемого объекта;

Слайд 7

Упрощенно: Инкапсуляция: способность скрывать детали объекта от пользователя. «Всё что может

Упрощенно:

Инкапсуляция: способность скрывать детали объекта от пользователя.
«Всё что может быть private должно

быть private»

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

Полиморфизм: (Poly = много, morph = форма) то, как классы, унаследованные от одного базового, выполняют методы своего класса-родителя.
Каждый по-своему
Как в базовом
Частично как в базовом + особенности и т.д.

Слайд 8

Как эти принципы реализованы в С# (Синтаксис)

Как эти принципы реализованы в
С#

(Синтаксис)

Слайд 9

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

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

Слайд 10

Модификаторы области видимости: public открытый член класса. Может быть прочитан или

Модификаторы области видимости:

public
открытый член класса. Может быть прочитан или изменен откуда

угодно

private
(по умолчанию) закрытый член класса. Доступен только из того объекта, в котором они определялись

protected защищенный член класса. Доступен напрямую из собственного класса и из всех дочерних классов.
«семейная тайна»

Слайд 11

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

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

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

Рассмотрим пример:

Слайд 12

Пусть у нас переменная, отвечающая за количество страниц в книге будет

Пусть у нас переменная, отвечающая за количество страниц в книге будет

открытой, объявлена с ключевым словом public.

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

А можем и вообще отрицательное число страниц задать…

Слайд 13

Чтобы решить проблему нужно сделать это поле закрытым (private или protected),

Чтобы решить проблему нужно сделать это поле закрытым (private или
protected), а

для обращения к нему воспользоваться одним из двух способов:

1. Создать традиционную пару методов – один для чтения переменной а второй для её изменения:

Теперь:

Но можно так:

Слайд 14

2. Определить именованное свойство: Теперь мы можем обращаться как к обычной,

2. Определить именованное свойство:

Теперь мы можем обращаться как к обычной, открытой

переменной:

Замечание 1: на самом деле свойства всегда отображаются в «реальные» методы доступа и изменения. Первый начинается с приставки get_, второй с set_. (get_NumberOfPages() и set_NumberOfPages()).

Замечание 2: чтобы сделать свойство доступным только для чтения, достаточно пропустить в нем блок set

Замечание 3: статическим переменным нужны статические свойства (public static string Name).

Слайд 15

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

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

Слайд 16

Наследование is-a (включение- делегирование) has-a (классическое) Получают функциональность от базового класса-предка

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

is-a
(включение- делегирование)

has-a (классическое)

Получают функциональность от базового класса-предка и дополняют новыми возможностями

Один класс включает

в свой состав другой и открывает внешнему миру часть возможностей внутреннего класса.

Object

Shape

Circle

Hexagon

Слайд 17

Классическое наследование в C# Некоторые замечания: Указатель на базовый класс «:»

Классическое наследование в C#

Некоторые замечания:
Указатель на базовый класс «:»
Наследуются только ОТКРЫТЫЕ

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

Определение:

Создаем объект производного класса :

Слайд 18

Запрет наследования Employee SalesPerson Manager PTSalesPerson (part-time) Для запрещения наследования предусмотрено ключевое слово sealed

Запрет наследования

Employee

SalesPerson

Manager

PTSalesPerson

(part-time)

Для запрещения наследования предусмотрено ключевое слово sealed

Слайд 19

Полиморфизм

Полиморфизм

Слайд 20

Переопределим реакцию объектов производных классов на метод базового класса.

Переопределим реакцию объектов производных классов на метод базового класса.

Слайд 21

Метод в базовом классе, который будет переопределен должен быть объявлен как

Метод в базовом классе, который будет переопределен должен быть объявлен как

виртуальный ( ключевое слово virtual)

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

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

Вызов методов:

Слайд 22

Абстрактные классы и методы Абстрактный класс: Абстрактные методы могут быть в

Абстрактные классы и методы

Абстрактный класс:

Абстрактные методы могут быть в базовом классе

без реализации по умолчанию. Каждый производный класс обязан самостоятельно определить этот метод.

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

Слайд 23

Жизненный цикл объекта Создание: используется ключевое слово new, обращаемся к конструктору

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

Создание: используется ключевое слово new, обращаемся к конструктору объекта.
Уничтожение:

обращаемся к деструктору.

Вопрос: как понять, что объект больше не нужен?

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

Удаление делается автоматически средой выполнения .NET

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

Сначала деструктор, потом физическое удаление из памяти.