Скачать презентацию Введение в ООП ОО-подход исторически пришел на смену Скачать презентацию Введение в ООП ОО-подход исторически пришел на смену

OOP_1.pptx

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

Введение в ООП ОО-подход исторически пришел на смену функциональному подходу, когда программа разбивалась на Введение в ООП ОО-подход исторически пришел на смену функциональному подходу, когда программа разбивалась на отдельные фрагменты – функции, которые получали исходные данные, в соответствии со своей логикой обрабатывали их и возвращали результат (как значении функции либо по ссылке через параметры). Для хранения данных для функций использовались переменные. int a, b, r; Input. A(out a); Input. B(out b); r = Sum. AB(a, b); Print(r);

 • Недостаток такого подхода - открытость всех данных. На любом этапе данные могли • Недостаток такого подхода - открытость всех данных. На любом этапе данные могли быть изменены, что привело бы к логической ошибке даже при правильном описании логики каждой функции в отдельности. • Еще один недостаток функционального подхода – концептуальное несоответствие предметной области. Сложно представить почему, например, какие-то 50 функций и 30 переменных, возможно описанные в разных файлах, представляют собой модель спортивного автомобиля или интернет магазина.

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

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

 • В процессе выделения объектов реального мира оказывается, что некоторые группы объектов характеризуются • В процессе выделения объектов реального мира оказывается, что некоторые группы объектов характеризуются одними и теми же свойствами, могут выполнять одни и те же действия. • Например, у любого объекта «ручка» есть свойства «цвет» и «толщина линии» . Независимо от того, какие значения принимают эти свойства, любой объект «ручка» может выполнить действие «провести линию» . • Такие группы называются классами объектов. • С точки зрения объектно-ориентированного программирования, класс – это тип, определенный пользователем, а объект – это экземпляр некоторого класса. • Объект представляет собой завершенную функциональную единицу, которая содержит все данные и предоставляет весь функционал, необходимый для решения задачи, для которой он предназначен.

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

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

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

 • При создании нового класса вместо написания полностью новых компонентов можно указать, что • При создании нового класса вместо написания полностью новых компонентов можно указать, что новый класс является наследником компонентов ранее определенного базового класса (суперкласса). Этот новый класс называется производным классом (подклассом). • Каждый производный класс сам является кандидатом на роль базового класса для будущих производных классов. • Например, можно описать базовый класс «человек» . А подклассами определить ему «студент» и «преподаватель» . Очевидно, что объекта «студент» появляются элементы (например, стипендия), которых нет у просто человека. • Класс «студент» может быть базовым для класса «студентдоговорник» , у которого появляется элемент «задолженность по оплате» .

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

 • Следует различать отношения «является» (IS-A)) и «содержит» (HAS-A). • «Является» — это • Следует различать отношения «является» (IS-A)) и «содержит» (HAS-A). • «Является» — это наследование. При отношении «является» объект типа производного класса является также объектом типа базового класса. Все объекты любых классов, открыто порожденных общим базовым классом, могут рассматриваться как объекты этого базового класса. • «Содержит» — это агрегирование (или композиция). При отношении «содержит» объект класса включает один или более объектов других классов в качестве своих элементов. • И наследование, и композиция способствуют повторному использованию уже разработанных возможностей путем создания новых классов, которые имеют много общего с существующими классами.

Полиморфизм • Полиморфизм — это такое состояние, когда нечто одно имеет много форм. • Полиморфизм • Полиморфизм — это такое состояние, когда нечто одно имеет много форм. • В программировании это означает, что одно имя (метода) может представлять различный программный код, выбранный автоматическим механизмом. • В ООП это соответствует наличию нескольких одноимённых методов, при этом автоматический выбор нужного метода зависит от внутреннего состояния объекта.

UML • Методология ООП тесно связана с концепцией автоматизированной разработки программного обеспечения (Computer Aided UML • Методология ООП тесно связана с концепцией автоматизированной разработки программного обеспечения (Computer Aided Software Engineering, CASE). Любое CASE-средство реализует ту или иную графическую нотацию. Одной из таких нотаций является унифицированный язык моделирования (Unified Modelling Language, UML). • Язык UML представляет собой общецелевой язык визуального моделирования, который разработан для спецификации, визуализации, проектирования и документирования компонентов программного обеспечения и других систем.

Диаграммы классов в UML • Диаграмма классов (class diagram) служит для представления статической структуры Диаграммы классов в UML • Диаграмма классов (class diagram) служит для представления статической структуры модели системы в терминологии классов ООП. • Класс (class) в языке UML служит для обозначения множества объектов, которые обладают одинаковой структурой, поведением и отношениями с объектами из других классов. Графически класс изображается в виде прямоугольника, который дополнительно может быть разделен горизонтальными линиями на разделы или секции. В этих разделах могут указываться имя класса, атрибуты (переменные) и операции (методы).

 • Обязательным элементом обозначения класса является его имя. На начальных этапах разработки диаграммы • Обязательным элементом обозначения класса является его имя. На начальных этапах разработки диаграммы отдельные классы могут обозначаться простым прямоугольником с указанием только имени соответствующего класса. • Во второй сверху секции прямоугольника класса записываются его атрибуты (attributes) или свойства. Каждому атрибуту класса соответствует отдельная строка текста, которая состоит из квантора видимости атрибута, имени атрибута, типа значений атрибута и, возможно, его исходного значения.

 • Квантор видимости может принимать одно из трех возможных значений и, соответственно, отображается • Квантор видимости может принимать одно из трех возможных значений и, соответственно, отображается при помощи специальных символов: • Символ "+" обозначает атрибут с областью видимости типа общедоступный (public). • Символ "#" обозначает атрибут с областью видимости типа защищенный (protected). • И, наконец, знак "-" обозначает атрибут с областью видимости типа закрытый (private). • В третьей сверху секции прямоугольника записываются операции или методы класса. Операция (operation) представляет собой некоторый сервис, предоставляемый каждым экземпляром класса по определенному требованию. Совокупность операций характеризует функциональный аспект поведения класса.

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

 • Отношение композиции является частным случаем отношения агрегации. • Это отношение служит для • Отношение композиции является частным случаем отношения агрегации. • Это отношение служит для выделения специальной формы отношения «часть-целое» , при которой составляющие части неотделимы от целого, т. е. с уничтожением целого уничтожаются и все его составные части. При этом наличие части является обязательным для целого.

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

Описание классов с помощью C# • Можно сказать, что классы это «шаблоны» объектов. • Описание классов с помощью C# • Можно сказать, что классы это «шаблоны» объектов. • Классы описывают все компоненты объекта (данные) и его поведение (методы), а также устанавливают начальные значения для данных объекта, если это необходимо. • При создании экземпляра класса в памяти создается копия данных этого класса. Созданный таким образом экземпляр класса называется объектом. • Экземпляр класса создается с помощью оператора new. • Для получения данных объекта или вызова методов объекта используется оператор (точка). Student s; // описание объекта s = new Student(); // создание объекта s. Name = “Иванов А. ”; // использование объекта . • При создании экземпляра класса, копия данных, описываемых этим классом, записывается в память (в кучу) и её адрес присваивается переменной ссылочного типа.

Объект: Student Данные - поля ID Name Phone. Number Num. Courses Методы Print. Sched() Объект: Student Данные - поля ID Name Phone. Number Num. Courses Методы Print. Sched() Change. Phone() Add. Course() Drop. Course() кол-во курсов в списке Courses должно быть равно Num. Course Добавить курс к списку курсов и увеличить Num. Course Убрать курс из списка курсов и уменьшить Num. Course

Составные элементы класса Телом класса является все, что написано между фигурными скобками после названия Составные элементы класса Телом класса является все, что написано между фигурными скобками после названия класса. 1. 2. 3. Поля (field) – обычно скрытые данные класса (внутренне состояние) Методы (methods) – операции над данными класса (поведение) (можно называть функциями) Свойства (property) – доступ к данным класса с помощью функций – – 4. get – получить set – задать События (event) – оповещение пользователей класса о том, что произошло что-то важное.

Описание классов программы using XXX; // чужие пространства имен namespace MMM // свое пространство Описание классов программы using XXX; // чужие пространства имен namespace MMM // свое пространство имен { class AAA // наш класс MMM. AAA { … } class BBB // другой наш класс MMM. BBB { … } } В одном пространстве имён описаны два класса.

Пример описания и использования класса • Самый простой класс class Car { } • Пример описания и использования класса • Самый простой класс class Car { } • Класс с полями class Car { // состояние Car. public string pet. Name; public int curr. Speed; }

Пример описания и использования класса • Класс с полями и методами class Car { Пример описания и использования класса • Класс с полями и методами class Car { // состояние Car. public string pet. Name; public int curr. Speed; // функциональность Car. public void Print. State() { Console. Write. Line("{0} is going {1} MPH. ", pet. Name, curr. Speed); } public void Speed. Up(int delta) { curr. Speed += delta; } } static void Main(string[] args) { Console. Write. Line ("***Используем Class Types***"); // Создаем и настраиваем объект Car my. Car = new Car(); my. Car. pet. Name = "Henry"; my. Car. curr. Speed = 10; // Ускоряем автомобиль несколько раз // и выводим на печать новое состояние. for (int i = 0; i <= 10; i++) { my. Car. Speed. Up(5); my. Car. Print. State(); } Console. Read. Line(); }

Пример описания и использования класса • Класс с полями и методами class Car Расширить Пример описания и использования класса • Класс с полями и методами class Car Расширить описание класса до { указанного функционала. // состояние Car. public string pet. Name; public int curr. Speed; // функциональность Car. public void Print. State() { Console. Write. Line("{0} is going {1} MPH. ", pet. Name, curr. Speed); } public void Speed. Up(int delta) { curr. Speed += delta; } }

Пример класса 2 • Объявляем человека, у которого есть имя и фамилия, а также Пример класса 2 • Объявляем человека, у которого есть имя и фамилия, а также возраст: сlass Man { public string name; public string sur. Name; public int age; } • Напишем метод человека, который будет сообщать как его зовут, свою фамилию и возраст. public void Speak() { Console. Write. Line("Меня зовут {0} {1} "+ "Мне {2} лет", name, sur. Name, age); }

Пример класса 2 • В методе Main() создаем объект этого класса: Man man = Пример класса 2 • В методе Main() создаем объект этого класса: Man man = new Man(); • И инициализируем его свойства: man. name = "Иван"; man. sur. Name = "Иваныч"; man. age = 45; • И наконец, он должен нам сказать кто он: man. Speak(); • Можно также создать несколько объектов одного класса: Man man = new Man(); Man man 1 = new Man();

Раздельное описание классов (partial classes) • Класс может быть определен по частям в нескольких Раздельное описание классов (partial classes) • Класс может быть определен по частям в нескольких файлах исходного кода (единицах компиляции) – это удобно для пошаговой разработки программ и быстрого внесения изменений // исходный файл 1 partial class C { public void M() { … } } // исходный файл 2 partial class C { public void N() { … } } § Множество элементов пошагово определенного класса является объединением всех множеств его элементов, определенных в отдельных исходных файлах

Конструктор класса • Конструктор класса – это метод, который вызывается всякий раз, когда создается Конструктор класса • Конструктор класса – это метод, который вызывается всякий раз, когда создается экземпляр класса. • Конструктор не должен иметь типа (void, string, int), а название должно соответствовать названию класса. • По умолчанию, каждый класс изначально дополняется пустым конструктором, который вызывается в операторе new при создании объектов. Man man = new Man(); • Фактически, имеет место конструктор public Man() {}; • Данный конструктор создаёт в куче экземпляр класса, заполняет его нулями и возвращает его адрес. • Если не требуется другого, то наличие данного конструктора по умолчанию достаточно.

 • Можно описать свои (пользовательские) конструкторы. При этом конструктор по умолчанию не действует. • Можно описать свои (пользовательские) конструкторы. При этом конструктор по умолчанию не действует. • Так, пользовательский конструктор может выдавать некоторую информацию: public Man() { Console. Write. Line("Экземпляр класса Man создан"); } • Обычно пользовательский конструктор заполняет поля объекта: public Man(string name, string sur. Name, int age) { this. name=name; this. sur. Name=sur. Name; this. age=age; } • Создавать объекты теперь можно по-разному: Man man 1 = new Man(); Man man 2 = new Man("Иван", "Иванович", 42);

Деструктор класса • Одной из главных функций любой схемы динамического распределения памяти является освобождение Деструктор класса • Одной из главных функций любой схемы динамического распределения памяти является освобождение свободной памяти от неиспользуемых объектов. Во многих языках программирования освобождение распределенной ранее памяти осуществляется вручную. Например, в С++ для этой цели служит оператор delete, а в Delphi – оператор dispose. • В С# применяется другой, более надежный подход: "сборка мусора", которая освобождает память от лишних объектов автоматически, действуя незаметно и без всякого вмешательства со стороны программиста. • "Сборка мусора" происходит следующим образом. Если ссылки на объект отсутствуют (прекратили своё существование после завершения блока, в котором они описаны), то такой объект считается ненужным, и занимаемая им память в итоге освобождается и может быть затем распределена для других объектов. • "Сборка мусора" может начаться не сразу после уничтожения ссылки, а спустя время, когда накопится несколько таких ссылок.

 • В языке С# имеется возможность определить метод, который будет вызываться непосредственно перед • В языке С# имеется возможность определить метод, который будет вызываться непосредственно перед окончательным уничтожением объекта системой "сборки мусора". • Такой метод называется деструктором и может использоваться в ряде особых случаев, чтобы гарантировать четкое окончание срока действия объекта. • Например, деструктор может быть использован для гарантированного освобождения системного ресурса, задействованного освобождаемым объектом. • Общая форма деструктора: ~имя_класса () { // код деструктора } • Деструктор вызывается непосредственно перед "сборкой мусора". Это означает, что заранее нельзя знать, когда именно будет вызван деструктор. Кроме того, программа может завершиться до того, как произойдет "сборка мусора", а следовательно, деструктор может быть вообще не вызван.

 • Пример класса с деструктором: class My. Class { //Конструктор public My. Class() • Пример класса с деструктором: class My. Class { //Конструктор public My. Class() { Console. Write. Line("Объект My. Class создан"); } //Деструктор ~ My. Class() { Console. Write. Line("Объект My. Class уничтожен"); Console. Read. Key(); } } static void Main() { My. Class My. Object = new My. Class(); }

Описатели режимов доступа Access modifiers Access Modifier Ограничения public Нет ограничений. Элементы отмеченные public Описатели режимов доступа Access modifiers Access Modifier Ограничения public Нет ограничений. Элементы отмеченные public видны любому методу любого класса. private Элементы класса A отмеченные как private доступны только методам класса A. protected Элементы класса A отмеченные как protected доступны методам класса A и методам производным от класса A. internal Элементы класса A отмеченные как internal доступны методам любого класса в сборке, в которой описан класс A. protected internal Элементы класса A отмеченные как protected internal доступны методам класса A, методам классов производных от класса A, а также любому классу в сборке, где описан класс A.

Режим доступа к классу • Класс может иметь режим доступа public или internal (по Режим доступа к классу • Класс может иметь режим доступа public или internal (по умолчанию). • По умолчанию элементы класса имеют режим доступа private, а типы (классы, структуры и т. п. ) по умолчанию имеют тип internal. // internal класс имеет конструктор с доступом private class Radio { Radio(){. . . } } • Для разрешения доступа к классу Radio из других сборок нужно добавить режим доступа public к описанию класса. • Чтобы разрешить другим типам использовать элементы объекта, нужно их отметить, как открыто доступных. // public класс имеет конструктор с доступом public class Radio { public Radio(){. . . } }

Статические компоненты класса • Поля, объявленные в классе с модификатором static являются общими для Статические компоненты класса • Поля, объявленные в классе с модификатором static являются общими для всех объектов этого класса. Для работы с такими полями используются статические методы, также объявленные со словом static. • Они не могут обращаться к обычным полям и методам, т. к. они не связаны с конкретными объектами класса и могут быть вызваны без привязки к объекту, а с привязкой к классу. void main() Class S { { S. x = 44; //+ public static int x; S. addx(23); //+ S. y = 12; //public int y; S. addy(55); //public static void addx(int d) { x += d; } S R = new S(); R. x = 44; //public void addy(int d) R. addx(23); //{ y += d; } R. y = 12; //+ } R. addy(55); //+ }