Класс «Человек»
Общая форма определения класса
Модификаторы доступа
Конструкторы
Создание конструкторов
Использование конструкторов
Ключевое слово this
Ключевое слово this
Способы инкапсуляции
Пример 1: Простой класс с инкапсуляцией
Способы инкапсуляции
Способы инкапсуляции
Способы инкапсуляции. Методы доступа
Пример 2: Расширенная инкапсуляция с использованием свойств
Пример 2: Расширенная инкапсуляция с использованием свойств
Пример 3:Методы доступа
Методы доступа
Методы доступа
Спасибо за внимание
7.90M
Category: programmingprogramming

Объектно-ориентированное программирование

1.

Объектноориентированное
программирование
Мельникова Татьяна Федоровна

2.

Цель: Изучение технологии объектно-ориентированного
программирования
Задачи:
-
Знакомство с объектно-ориентированной моделью
программирования
-
Рассмотреть основные принципы объектноориентированного программирования: инкапсуляция и
полиморфизм, наследование
-
Рассмотреть понятие класса и объекта, их свойств и методов

3.

Опрос:
1 Структура – это …
2 К какому типу данных относится структура?
3 В каком участке памяти записывается структура?

4.

Объектно-ориентированный подход
Объектно-ориентированный подход к проектированию
ИС основан на представлении предметной области
задачи в виде множества моделей для независимой от
языка разработки программной системы на основе ее
действий.
Действия определяется целью разработки программной
системы, например, обслуживание клиентов банка,
управление работой аэропорта, обслуживание
чемпионата мира по футболу и т.п.

5.

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

6.

Основы объектно-ориентированного программирования
Объектно-ориентированное программирование (ООП) — это
методика разработки программ, в основе которой лежит понятие
объект.
Объект — это некоторая структура, соответствующая объекту
реального мира, его поведению.
Задача, решаемая с использованием
методики ООП, описывается в
терминах объектов и операций
над ними,
а программа при таком подходе
представляет собой набор объектов
и связей между ними.

7.

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

8.

Концепции ООП

9.

Принципы объектно-ориентированного программирования
Инкапсуляция- это механизм программирования, объединяющий
вместе код и данные, которыми он манипулирует, исключая как
вмешательство извне, так и неправильное использование данных.
*Наследование - построение новых классов, которые наследуют
данные и функции от одного или нескольких ранее определенных
базовых классов, с возможным переопределением или добавлением
новых данных и функций. Это создает иерархию классов.
* Полиморфизм- возможность использования методов с
одинаковым именем, но с разным содержанием (слово
полиморфизм происходит от греческого "имеющий много форм")

10.

Основы объектно-ориентированного программирования
В ООП – класс это основной элемент, в рамках которого
осуществляется конструирование программ. Класс содержит в
себе данные и код, который управляет этими данными.
Класс описывает объект реального мира средствами языка
программирования.
Как и реальный объект, класс содержит свой набор параметров и
характеристик. Каждый такой параметр называется полем класса
(переменные, массивы и др.).
Также класс способен манипулировать своими характеристиками
(полями) с помощью методов класса (функции и процедуры).
Рассмотрим такой объект реального мира, как человек.

11. Класс «Человек»

характеристики
Экземпляр
класса «Человек»

12.

13.

Класс — это логическая структура, позволяющая
создавать свои собственные пользовательские типы путем
группирования переменных других типов, методов и событий
Вместе данные и поведение представляют собой класс.
В соответствии с этим все объекты разделены на 2 основных типа –
классы и экземпляры.
Класс определяет структуру и функциональность (поведение),
одинаковую для всех экземпляров этого класса.
Экземпляр считается носителем данных – то есть обладает
состоянием, меняющимся в соответствии с поведением, заданным классом.
Новый экземпляр создаётся посредством вызова конструктора класса
(возможно, с комплектом параметров).
Получившийся экземпляр имеет структуру и поведение, жёстко
установленные его классом

14. Общая форма определения класса

15.

Данные-члены
Данные-члены — предназначены для хранения данных,
ассоциированных с экземпляром класса
Они копируются для каждого экземпляра класса (если только
компонент не объявлен с ключевым словом static).
Ключевое слово static определяет компонент статическим.
Основное свойство статического компонентного данного
заключается в том, что память под него выделяется
единственный раз в программе, причем еще до определения
объектов данного класса.
Все объекты работают с единственным статическим
компонентом.
В качестве данных-членов в классе можно объявить поля,
константы и события.
Поля (field) - это любые переменные, ассоциированные с
классом.

16.

Данные-члены
Константа объявляется с помощью ключевого слова const и не
допускает своего изменения и требует инициализации при
объявлении. Если она объявлена как public, то в этом случае
становится доступной извне класса.
События - это члены класса, позволяющие объекту уведомлять
вызывающий код о том, что случилось нечто достойное
упоминания.
Например, изменение свойства класса либо некоторое
взаимодействие с пользователем (т.е. представляют собой
интерфейс).
Клиент может иметь код, который является обработчиком
событий, реагирующий на них.
Определяется событие с использованием ключевого слова event.

17.

Функции-члены
Функции-члены — это члены, которые обеспечивают
некоторую функциональность для манипулирования данными
класса.
Методы (method) - это функции, ассоциированные с
определенным классом. Как и данные-члены, по умолчанию они
являются членами экземпляра. Они могут быть объявлены
статическими с помощью модификатора static.
Свойства (property) - это наборы функций, которые могут быть
доступны клиенту таким же способом, как общедоступные поля
класса.
В C# предусмотрен специальный синтаксис для реализации
чтения и записи свойств для классов, поэтому писать собственные
методы с именами, начинающимися на set и get, не понадобится.
Индексаторы (indexer) - позволяют индексировать объекты
таким же способом, как массив или коллекцию.

18.

Функции-члены
Конструкторы (constructor)- это специальные функции,
вызываемые автоматически при инициализации объекта.
Их имена совпадают с именами классов, которым они
принадлежат, и они не имеют типа возврата. Конструкторы
нужны для инициализации полей класса.
Операции (operator)- это простейшие действия вроде + или -.
Когда вы складываете два целых числа, то, строго говоря,
применяете операцию + к целым числам.
C# позволяет указать, как существующие операции будут работать
с пользовательскими классами (это называется перегрузка
операции).
.

19.

Класс создается с помощью
ключевого слова class.
Определение класса, содержащего
только переменные экземпляра и
методы:
class имя_класса
{
// Объявление переменных экземпляра
доступ тип переменная1;
...
доступ тип переменнаяN;
// Объявление методов
доступ возращаемый_тип метод1
(параметры)
{ // тело метода1 }
доступ возращаемый_тип
методN(параметры)
{ // тело методаN }
}
Создание класса
class Person
{
// Поле «имя»
public string name = "Undefined";
// Поле «возраст»
public int age;
// метод вывода данных
public void Print()
{
Console.WriteLine($"Имя:
{name} Возраст: {age}");
}
}

20.

Описание класса
Права доступа к компонентам класса задаются
индивидуально для каждого. В качестве модификатора прав
доступа могут использоваться ключевые слова
private, protected и public.
В языке С# введен модификатор internal, который означает
доступность компонента класса из любого файла сборки и
запрещает доступ к нему извне сборки.
Указывать спецификатор доступа не обязательно, но если он
отсутствует, то объявляемый член считается закрытым в
пределах класса.
Члены с закрытым доступом могут использоваться только
другими членами их класса.

21. Модификаторы доступа

Модификатор
доступа
Назначение
public
Общедоступные элементы не имеют ограничений доступа
(доступен как из объекта, из любого производного класса, так
и доступен из других внешних сборок)
private
Приватные элементы могут быть доступны только в классе
(или структуре), в котором они определены
protected
такой компонент класса доступен из любого места в своем
классе или в производных классах. При этом производные
классы могут располагаться в других сборках.
internal
компоненты класса или структуры доступен из любого
места кода в той же сборке, однако он недоступен для
других программ и сборок
рrotected
internal
Такой компонент класса доступен из любого места в
текущей сборке и из производных классов, которые могут
располагаться в других сборках.

22.

Создание объектов класса
После определения класса можно создавать его объекты.
Для создания объекта применяются конструкторы.
Конструкторы представляют специальные методы, которые
называются так же как и класс, и которые вызываются при
создании нового объекта класса и выполняют
инициализацию объекта. Общий синтаксис вызова
конструктора:
<тип класса> имя переменной = new <тип класса>();
Например: Person Р1 = new Person(); // создание объекта класса
Конструктор по умолчанию
Если в классе не определено ни одного конструктора (как в
случае с классом Person), то для этого класса автоматически
создается пустой конструктор по умолчанию, который не
принимает никаких параметров.

23.

Создание объектов класса
Для создания объекта Person используется выражение
new Person(). В итоге после выполнения данного выражения в
памяти будет выделен участок, где будут храниться все данные
объекта Person. А переменная Р1 получит ссылку на созданный
объект, и через эту переменную можно использовать данный
объект и обращаться к его функциональности.
Объекты классов доступны по ссылке, поэтому классы
называются ссылочными типами.
Главное отличие типов значений (структуры) от ссылочных типов
заключается в том, что именно содержит переменная каждого из
этих типов.
Так, переменная типа значения содержит конкретное значение,
а ссылочная переменная содержит не сам объект, а лишь ссылку
на него.

24.

Пример
Для обращения к функциональности класса - полям, методам (и
др. элементам класса) применяется точечная нотация точки - после
объекта класса ставится точка, а затем элемент класса:
объект.поле_класса
объект.метод_класса(параметры_метода)
Person P1 = new Person(); // создание объекта класса Person
// Получаем значение полей в переменные
string personName = P1.name;
int personAge = P1.age;
Console.WriteLine($"Имя: {personName} Возраст {personAge}"); // Имя: Undefined
// Возраст: 0
// устанавливаем новые значения полей
P1.name = "Бердин Михаил"; // можно ввести данные
P1.age = 28;
// обращаемся к методу Print
P1.Print();
// Имя: Бердин Михаил Возраст: 28

25. Конструкторы

Конструктор инициализирует объект при его создании.
У конструктора такое же имя, как и у его класса, он подобен методу.
Но у конструкторов нет возвращаемого типа, указываемого явно.
Общая форма конструктора:
доступ имя_класса(список_параметров)
{
// тело конструктора
}
Конструктор используется для задания первоначальных значений
переменных экземпляра, определенных в классе, или же для
выполнения любых других установочных процедур, которые
требуются для создания полностью сформированного объекта.
Доступ представляет собой модификатор доступа типа public,
поскольку конструкторы зачастую вызываются в классе.
А список_параметров может быть как пустым, так и состоящим из
одного или более указываемых параметров.

26. Создание конструкторов

class Person
{
public string name;
public int age;
public Person()
{ name = "Неизвестно"; age = 18; } // 1 конструктор
public Person(string n)
{ name = n; age = 18; }
// 2 конструктор
public Person(string n, int a) { name = n; age = a; } // 3конструктор
public void Print()
{
Console.WriteLine($"Имя: {name} Возраст: {age}");
}
}

27. Использование конструкторов

Person P = new Person();
// вызов 1-ого конструктора без параметров
//вызов 2-ого конструктора с одним параметром
Person P2 = new Person(" Красоткин Антон");
// вызов 3-его конструктора с двумя параметрами
Person P3 = new Person("Широков Сергей", 39);
P.Print();
// Имя: Неизвестно Возраст: 18
P2.Print();
// Имя: Красоткин Антон Возраст: 18
P3.Print();
// Имя: Широков Сергей Возраст: 39

28. Ключевое слово this

представляет ссылку на текущий экземпляр/
объект класса. В каких ситуациях оно может пригодиться?
class Person
{
public string name;
public int age;
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
public void Print() => Console.WriteLine($"Имя: {name}
Возраст: {age}");
}
Person P4 = new(«Бек Тейлор",34);
P4.Print(); // Имя: Бек Тейлор Возраст: 34

29. Ключевое слово this

Чтобы разграничить параметры и поля класса, к полям класса
обращение идет через ключевое слово this. Так, в выражении
this.name = name;
первая часть - this.name означает, что name - это поле текущего
класса, а не название параметра name.
Если параметры и поля назывались по-разному, то
использовать слово this было бы необязательно. Также через
ключевое слово this можно обращаться к любому полю или
методу.

30. Способы инкапсуляции

Инкапсуляция предоставляет способ предохранения
целостности данных о состоянии объекта.
Согласно принципу инкапсуляции класс может задать уровень
доступности каждого из членов по отношению к коду вне класса.
Методы и поля, которые не предназначены для использования
вне класса или сборки, могут быть скрыты, с целью ограничения
потенциальной угрозы возникновения ошибок программного
кода или его вредоносное использование.
Реализация принципа инкапсуляции обеспечивается за счет:
1) использования спецификаторов доступа для каждого члена
класса;
2) использования свойств.

31.

Две причины использования инкапсуляции – это контроль использования и
минимизация воздействий при изменениях. Можно использовать инкапсуляцию
данных и определить поведение для того, чтобы с объектом работали по
заданным правилам. Вторая причина вытекает из первой, если данные закрыты
от внешнего использования, то их изменение не влияет на использование
объекта извне.

32. Пример 1: Простой класс с инкапсуляцией

public class BankAccount
{
private double balance;
// Приватное поле, не доступно извне
public BankAccount(double initBalance) // конструктор
{
balance = initBalance;
}
// Метод для добавления средств на счет
public void Deposit(double amount)
{
if (amount > 0)
{
balance += amount;
}
}
// Метод для получения текущего баланса
public double GetBalance()
{
return balance;
}
}
В примере
переменная balance
инкапсулирована в
классе
BankAccount.
Она private, что
означает, что
доступ к ней
возможен только
через публичные
методы Deposit и
GetBalance.

33. Способы инкапсуляции

Свойства служат для организации упорядоченного доступа к
полям класса. Как правило, свойство связано с закрытым полем
класса и определяет методы его получения и установки.
Стандартное описание свойства имеет следующий синтаксис:
[модификаторы] тип_свойства название_свойства
{
get { действия, выполняемые при получении значения свойства}
set { действия, выполняемые при установке значения свойства}
}
Значения спецификаторов для свойств и методов аналогичны.
Чаще всего свойства объявляются как открытые (со
спецификатором public), поскольку они входят в интерфейс
объекта.

34. Способы инкапсуляции

Код доступа представляет собой блоки операторов, которые
выполняются при получении (get) или установке (set) свойства.
Может отсутствовать либо часть get, либо set, но не обе
одновременно.
Если отсутствует часть set, свойство доступно только для чтения
(read-only), если отсутствует часть get, свойство доступно
только для записи (write-only).
Синтаксически чтение и запись свойства выглядят почти как
методы.
Метод get должен содержать оператор return, возвращающий
выражение, для типа которого должно существовать неявное
преобразование к типу свойства.
В методе set используется параметр со стандартным именем
value, который содержит устанавливаемое значение.

35. Способы инкапсуляции. Методы доступа

Таким образом, свойство — это член,
предоставляющий гибкий механизм для чтения,
записи или вычисления значения частного (private)
поля.
Также свойства позволяют вложить дополнительную
логику, которая может быть необходима при
установке или получении значения.

36. Пример 2: Расширенная инкапсуляция с использованием свойств

public class Person
{ private string name;
public string Name
{ get { return name; }
set
{
if (!string.IsNullOrEmpty(value))
name = value;
}
}
private int age;
public int Age
{
get { return age; }
private set
{
if (value < 1 || value > 100)
Console.WriteLine("Возраст должен быть в
диапазоне от 1 до 100");
else
age = value;
}
}
public Person(string name, int age)
{
Name = name;
Age = age;
}
public void CelebrateBirthday()
{
Age++;
}
}
В этом примере используем свойства
Name и Age, чтобы обеспечить более
тонкий контроль над тем, как
внешний код может
взаимодействовать с полями класса.
Age устанавливается как приватное
свойство, что означает, что его
нельзя изменить извне класса
напрямую, а Name требует непустой
строки для установки.

37. Пример 2: Расширенная инкапсуляция с использованием свойств

В процедуру Main() запишем следующий код
Person p1 = new Person ();
p1 .Name = "Иванов"; p1.Age = 18;
Console.WriteLine("Сотрудник {0}, возраст {1}", p1.Name, p1.Age);
Person p2 = new Person ();
p2.Name = "Сидоров";
Console.WriteLine(p2.Age);
Console.WriteLine("Сотрудник {0}, возраст {1}", p2.Name, p2.Age);
// пробуем передать недопустимое значение
p2.Age = -23; // Возраст должен быть в диапазоне от 1 до 100
Console.WriteLine(p2.Age);
p1. CelebrateBirthday();
Console.WriteLine("Сотрудник {0}, возраст {1}", p1.Name, p1.Age);

38.

Автоматические свойства
Свойства управляют доступом к полям класса. Однако что, если полей много,
то определять каждое поле и писать для него однотипное свойство
утомительно. Поэтому в фреймворк .NET были добавлены автоматические
свойства. Они имеют сокращенное объявление:
class Person
{
public string Name { get; set; }
public int Age { get; set; }
Автосвойствам можно присвоить
значения по умолчанию:
class Person
{
public string Name { get; set; } = “Иван";
public int Age { get; set; } = 17;
}
public Person(string name, int age)
{
Name = name;
Автосвойства могут иметь модификаторы
Age = age;
доступа:
}
class Person
}
{ public string Name { private set; get;}
public Person(string name) => Name = name;
}

39. Пример 3:Методы доступа

Выполните пример, объясните как применяется принцип инкапсуляции
// Объявление класса
public class Rectangle
{
// Члены класса- Поля
private int FSideA;
private int FSideB;
private string FName;
// Конструктор с аргументами
public Rectangle(string Name, int SideA, int SideB)
{
FSideA = SideA;
FSideB = SideB;
FName = Name;
}

40. Методы доступа

// Свойства -только для чтения
public int Perimeter
{ get {return (FSideA + FSideB) * 2;}
}
// Для чтения и для записи
public string Name
{
set { FName=value; }
get { return FName; }
}
}

41. Методы доступа

static void Main(string[] args)
{ // Создание объекта
Rectangle myRectangle = new Rectangle("Большой
прямоугольник",5,10);
// Вывод свойства фигуры :имя
Console.WriteLine(myRectangle.Name);
// значение периметра
Console.WriteLine(myRectangle.Perimeter);
Console.ReadKey();
}

42.

Инициализаторы объектов
Инициализаторы объектов предоставляют способ создания
объекта и инициализации его полей и свойств.
Синтаксис инициализатора объекта предоставляет альтернативу
явному вызову конструктора класса.
Синтаксис инициализатора объекта используется главным
образом при создании анонимных типов в LINQ-выражениях.
Общая форма синтаксиса инициализации объектов:
new имя_класса {имя = выражение, имя = выражение, ...}
где имя обозначает имя поля или свойства, т.е. доступного члена
класса, на который указывает имя_класса.
А выражение обозначает инициализирующее выражение, тип
которого, конечно, должен соответствовать типу поля или
свойства.

43.

Пример использования инициализаторов объекта
namespace ConsoleApplication1
{ class autoCar
{
public string marka;
public short year;
}
class Program
{
static void Main(string[] args)
{
// используем инициализаторы
autoCar myCar = new autoCar { marka = "Renault", year = 2016 };
Console.ReadLine();
}
}
}

44.

Вопросы для самоконтроля
1.Дайте определения понятиям класс и объект.
2.Что такое конструктор класса? Какую роль он играет в
жизненном цикле объекта?
3 Какие члены класса содержат данные?
4 Какие члены класса содержат код?
5.Чем отличаются статические компоненты классов от прочих
компонентов? Как определить статический компонент класса?
6.Каково назначение указателя this? Приведите примеры его
использования.
7.Перечислите, какие компоненты могут быть включены в класс
языка С#. В чем особенности использования каждого из них?
8.Как определяются свойства языка C#? Приведите примеры
определения свойств в классе.

45.

Домашнее задание
Заполнить таблицу сравнения классов и структур
Вопрос
Какого же типа экземпляр объекта?
Где выделяется память для
экземпляров этих объектов?
Можно ли создать конструктор по
умолчанию?
Если в конструкторе не будут
инициализированы некоторые поля,
будут ли они автоматически
инициализированы компилятором?
Разрешается ли инициализировать
переменные там, где их объявляют?
Структура
Класс

46. Спасибо за внимание

*
English     Русский Rules