Что такое свойства в ооп
Объектно-ориентированное программирование. Часть 1. Что такое классы и объекты
Почти всё современное программирование построено на принципах ООП, поэтому их должен понимать каждый разработчик. Узнайте основы из этой статьи.
Введение
Это первая статья из серии, посвященной объектно-ориентированному программированию. Она предназначена для тех, кто хочет понять саму суть этой парадигмы разработки, а не просто научиться использовать классы и объекты.
Цикл состоит из статей, посвященных различным аспектам ООП:
Все примеры в этой серии мы рассмотрим на языке C#. Для наглядности они будут связаны с разработкой игр, потому что в них активно используются объекты.
Перед чтением этой серии статей вам нужно ознакомиться с такими понятиями:
Работа будет происходить в Visual Studio 2019, но вполне подойдет и VS 2017.
В конце каждой статьи будут задания, которые помогут закрепить тему. Выполнив задание, загружайте его на GitHub и пишите в комментариях ссылку на репозиторий — я постараюсь проверить каждое решение и дать обратную связь (но я всего лишь человек).
Выполнять задания не обязательно, но без практики просто невозможно осилить такую сложную тему, как ООП. Если же вам все равно лень выполнять задания, можете просто посмотреть мой вариант решения, который я также буду публиковать в комментариях.
Пишет о разработке сайтов, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.
Что такое ООП
Объектно-ориентированное программирование (сокращенно ООП) — это парадигма разработки программных систем, в которой приложения состоят из объектов.
Объекты — это сущности, у которых есть свойства и поведение. Обычно объекты являются экземплярами какого-нибудь класса. Например, в игре может быть класс Character (персонаж), а его экземплярами будут hero или npc.
Свойства — это данные, которые связаны с конкретным объектом:
Поведение объекта определяется с помощью методов — специальных блоков кода, которые можно вызывать из разных частей программы. Например, у того же объекта Character могут быть следующие методы:
Используя эти свойства и методы, можно значительно ускорить разработку, сделать код более читаемым. К тому же самому программисту проще составлять код, если он думает с помощью объектов.
То есть он не пишет какую-то функцию, которая будет делать что-то для программы в целом. Вместо этого он мысленно разделяет приложение на отдельные компоненты и продумывает их свойства и поведение.
Такую парадигму используют многие популярные языки:
Плюсы и минусы объектно-ориентированного программирования
Плюсы | Минусы |
---|---|
Легко читается. Не нужно выискивать в коде функции и выяснять, за что они отвечают. | Потребляет больше памяти. Объекты потребляют больше оперативной памяти, чем примитивные типы данных. |
Быстро пишется. Можно быстро создать сущности, с которыми должна работать программа. | Снижает производительность. Многие вещи технически реализованы иначе, поэтому они используют больше ресурсов. |
Проще реализовать большой функционал. Так как на написание кода уходит меньше времени, можно гораздо быстрее создать приложение с множеством возможностей. | Сложно начать. Парадигма ООП сложнее функционального программирования, поэтому на старт уходит больше времени. |
Меньше повторений. Не нужно писать однотипные функции для разных сущностей |
Как использовать классы и объекты
Изучая C#, разработчик в первый же день сталкивается с классами и объектами. Например, вот как выглядит первая программа любого новичка:
Здесь создается класс Program, у которого есть метод Main () — с него начинается выполнение программы, поэтому его называют точкой входа.
Для вывода текста используется следующий оператор:
Тут программа обращается к объекту Console и вызывает метод WriteLine (), который выводит переданное значение в консоль.
Также у объекта Console есть разные свойства:
Если бы не было объекта, было бы сложно определить, цвет какого фона и какого шрифта будет указываться, потому что их в программе может быть несколько.
Объект и его свойства. Характеристики ООП
В середине 80-х годов XXв. в программировании возникло новое направление, основанное на понятии объекта. ООП предназначено для написания сложных систем. Возникла потребность разделить программы не просто на процедуры, а на полностью независимые и самостоятельные классы процедур, которые сами отвечают за свое внутреннее состояние и внешнее поведение. Их отличительная черта состоит в том, что базируясь на эти классы, можно строить совершенно различные приложения.
Перед тем как начать создавать класс, необходимо определить три основных момента: 1.Какие действия должны выполнять объекты класса? 2.Что должен содержать класс объектов для выполнения действий? 3.Какие действия присущи объектам данного класса? Класс характеризуется следующими основополагающими понятиями ООП. 1.Наследование.Позволяет создавать новые классы на основе имеющегося класса, с наследованиемвсех его свойств и методов и добавлением собственных. Класс, не имеющий предшественника, называется базовым. Если первый называется базовым, то второй – производным классом (или подклассом). Иерархия. Производный класс сам может служить базовым. От одного базового класса можно образовывать несколько производных. Знание иерархии классов важно для понимания процессов выдачи ответов на сообщение. При получении сообщения объект ищет в протоколе методов экземпляра своего класса метод, совпадающий с именем сообщения. Если такого метода нет, он ищется в списке методов базового класса и т.д. когда метод обнаружен, он выполняется и выдается ответ. Если нигде нет, вплоть до корня дерева, метод не обнаружен, выдается сообщение об ошибке. 2. Полиморфизм.Объекты разных классов могут использовать одноименные методы, работающие по-разному для разных объектов. Или, другими словами, различные объекты выполняют одно и то же действие по-своему. В связи с этим в большинстве случаев методы базового класса у производных классов приходится переопределять. Итак, свойство объектов переопределять методы базового (наследуемого) класса и называется полиморфизмом.Полиморфизм проявляется в том, что одно и то же сообщение может посылаться разным объектам, и понимают они его каждый по-своему. Это увеличивает наглядность программ, поскольку не надо беспокоиться о случайном совпадении имен сообщений. Классы также являются объектами и им тоже можно посылать сообщение. Ведь сообщение – это вызов методов с заданными параметрами. 3.Инкапсуляция.Скрытие сложного механизма действия объекта, т.е. скрытие деталей, несущественных для использования объекта. Определив класс, можно создавать объекты этого класса и манипулировать ими, используя методы. Объекты, принадлежащие одному и тому же типу, образуют коллекцию. Причем, это будут объекты не обязательно одного класса.Свойства.Во многих языках программирования свойства реализуются в виде пары методов: метод, получающий текущее значение свойства, называется акцессор; метод, задающий новое значение свойства — мутатор. Принято называть процедуры свойств именем свойства с приставками get и set.С точки зрения пользователя, свойства выглядят практически так же, как и обычные поля класса. Им можно присваивать некоторые значения и получать их обратно. Свойства позволяют не только возвращать и изменять значение внутренней переменной класса, но и выполнять дополнительные функции.
События.Событийная модель применяется повсеместно, но наиболее часто при создании интерфейса пользователя, когда каждое действие пользователя представляется в виде события и передается определенному объекту. Для объявления события в C# используются делегаты. Когда происходит событие, вызываются все методы делегатов, переданных классу клиентами. События могут использоваться только в том классе, в котором они описаны и не могут напрямую использоваться в порожденных классах.
12.Классы в C#. Форма определения класса. Члены класса: методы, поля, свойства и события.
Метод ReadLine.Метод ReadLine читает из потока ввода строку текста (она завершается символом перевода строки или возврата каретки).
Методы Write и WriteLine.Метод Write выводит на экран значение переданной ему переменной. Он определен для всех базовых типов и поддерживает форматированные строки. Т.обр, можно либо вызвать Write с указанным значением в качестве параметра, либо передать строку форматирования и список значений.
Поля структур.Структурные типы, поддерживаемые большинством языков программирования (называемые структурами (structure) в Си, записями (record) в Паскале и т.д.), являются частным случаем классов — а именно, классами из одних только полей. Вся информация, относящаяся к полям классов, в равной степени относится и к структурным типам. Статические поля.Обычно каждому объекту соответствуют собственные значения всех его полей. Также к полям класса относят статические поля (staticdatamembers, staticclassfields, classvariables) — поля, общие для всех объектов класса.Статические поля семантически не отличаются от обычных глобальных переменных, но они доступны только по указанному имени класса, и поэтому, в отличие от глобальных переменных, не загромождают пространство глобальных имён. Битовые поля.Эти поля занимают менее одной единицы памяти (байт, слово); компилятор сам упаковывает несколько битовых полей в одну единицу памяти, позволяя при этом обращаться к битовым болям как к отдельным полям класса. Понятие битовых полей не ограничивается полями классов: по аналогии оно было перенесено и на другие случаи упаковки в одну единицу памяти нескольких значений, например в сетевых протоколах и в форматах файлов. Поля только для чтения (readonly Fields).Поскольку переменные многих типов не могут быть константами, в некоторых ситуациях использовать ключевое слово const невозможно.
В Си Шарп события неотъемлемо связаны с делегатами. Именно на делегатах основана вся модель событий в C#. Чаще всего события (events) используются в windows приложениях в которых допустим кнопка Button реагируя на события, выдают информацию на той же панели где они расположены (например щелчок мышкой). Но события так же можно использовать и в консольных приложениях.
13.Конструкторы. Параметризованные конструкторы. Использование оператора new.
Конструктор – это специальный метод, который инициализирует объект при его создании. Характеристика конструкторов.
Формат записи: 1) имя конструктора совпадает с именем класса; 2) конструктор не может возвращать значения; 3) конструкторы могут быть перегружены.
Обычно в качестве модификационного доступа используется public, т.к. конструктор вызывается вне класса (чаще всего). Если вы не создали конструктор, то компилятор C# автоматически предоставляет конструктор по умолчанию, который инициализирует все переменные члены, имеющие тип значений нулями, а переменные- члены ссылочного типа – null- значениями. Примечание: конструктор класса по умолчанию- это конструктор, который не принимает никаких параметров. Чаще используют конструкторы, которые принимают один или несколько параметров, чтобы инициализировать ответ в момент его создания, установив ему нужные значения. Процесс создания и использования нескольких конструкторов с одинаковым именем называют перегрузкой конструктора. Примечание: Перегрузка- один из видов полиморфизма. Благодаря перегрузке конструкторов могут меняться различные способы создания объектов. Вызов того или иного конструктора определяется набором передаваемых ему параметров (сигнатурой).
При использовании newCLR выделяет память и вызывает конструктор. Конструктор – это специальные метод, который называется также как и класс, может иметь параметры, но не может возвращать значение (даже void). Каждый класс должен иметь конструктор, если его не создали, то конструктор создастся по умолчанию.
При создании объекта структуры с помощью оператора new объект создается и вызывается соответствующий конструктор.В отличие то классов структуры можно создавать без использования оператора new.В таком случае вызов конструктора отсутствует, что делает выделение более эффективным.Однако поля остается без значений и объект нельзя использовать до инициализации всех полей.
Когда структура содержит ссылочный тип в качестве члена, конструктор по умолчанию члена должен вызываться явно, в противном случае член останется без значений и структура не сможет использоваться.
14. Типы значений и ссылочные типы. Динамическое использование памяти: стеки и кучи. Упаковка и распаковка.
Все типы в C# разделяются на две основные разновидности: структурные типы (value- based) или типы значений и ссылочные типы (reference- based). К структурным типам относятся все числовые типы данных (int, float и пр.), а также перечисления и структуры. При присвоении одного структурного типа другому присваивается не сам тип (как область в памяти), а его побитовая копия. Память для структурных типов выделяется из стека.Стек резервируется для хранения данных, создаваемых во время компиляции программы. В стеке применяется принцип обслуживания типа LiFO (LastinFirstOut – последним применен- первым обслужен). Согласно этому методу, первым обрабатывается последний из поступивших запросов. Выделение памяти. Выделение памяти из кучи в среде NetRuntime происходит очень быстро. Система убеждается в том, что в управляемой куче хватает памяти для запрашиваемого объекта, возвращает указатель на эту память и переводит указатель на следующий после последнего объекта адрес. Когда операционная система запускает приложение на выполнение, CLR резервирует непрерывный диапазон адресов адресного пространства, который называют управляемой кучей. Указатель NextPtr (NextPointer) сохраняет адрес кучи, в который может быть размещён следующий объект. В начальный момент, когда в куче ещё нет ни одного объекта, этот указатель указывает на базовый адрес зарезервированного адресного пространства. После того как приложение использует оператор new для создания объекта, CLR проверяет доступно ли в куче необходимое количество байт. После чего указатель NextPtr вызывает адрес для нового объекта в куче. Вызывается конструктор объекта. Оператор new возвращает адрес. После этого значение указателя NextPtr увеличивается и он сохраняет адрес для записи следующего объекта в управляемой куче. Указатель NextPtr ← Объект А; Объект В; Объект С. Типы значений можно разделить на 3 группы: простые типы, структуры и перечисление. Ссылочные типы (классы, интерфейсы, массивы, строки) хранят ссылки на данные, вместо действительных данных и ведут себя по- другому. Память для них выделяется не в стеке, а в области управляемой кучи. Ссылочная переменная содержит информацию о месте хранения, т.е. ссылку на данные. Каждая активная ссылка на объект в памяти называется корнем.
Ссылки указывают на местонахождение объектов в управляемой куче. Когда много создано объектов, пространство в управляемой куче может закончится. Тогда автоматически запускается сборщик мусора. Он отслеживает, есть ли в куче активные ссылки. Если ссылок на объект нет или объект установлен на null, то объект помечается для удаления. При копировании ссылочного типа создаётся ещё одна ссылка, которая указывает на туже область оперативной памяти. Можно изменить исходный объект. studentstud3= stud1; Обе переменные stud1 и stud3 ссылаются на один и тот же объект. На этот объект можно воздействовать, используя либо stud1, либо stud3. stud3.Addstip (-10000); stud3. Show_Student ( ); stud1. Show_Student ( ); (Получаемодинитожезнак). От структурного типа к ссылочному типу и наоборот: упаковка и распаковка. В C# предусмотрен очень простой механизм для преобразования структурного типа в ссылочный. Он получил название упаковки (boxing). Предположим, что у нас есть (создаём переменную S) shortS=25;
А вот как выглядит процесс упаковки – преобразование объекта структурного типа в ссылочный: (Упаковываем переменную S) objectobjshort=s; (наше имя)
Упаковка- это процесс явного преобразования структурного типа в ссылочный. При этом происходит следующее: в управляемой куче создаётся новый объект и в него копируются внутренние данные старого объекта из стека (у нас-25). Противоположная операция называется распаковкой (unboxing). Распаковка– это преобразование ссылки на объект в оперативной памяти обратно в структурный тип. Перед выполнением распаковки среда выполнения CLR производит проверку на совместимость между типом объекта в оперативной памяти и тем структурным типом, в который будет производиться распаковка. (Обратная распаковка объекта)
shortanotherShort=(short) obj’short; Если же среда выполнения обнаружит, что происходит распаковка в неподходящий тип данных, будет сгенерировано исключение InvalidCastException. (Неверная распаковка) StringStr=(string)obj’short;
В большинстве случаев операции по упаковке и распаковке выполняются компилятором в C# полностью автоматически. Например, если структурный тип передаётся методу, который принимает в качестве параметра объект, упаковка произойдёт автоматически. Явная упаковка и распаковка используется в C# только тогда, когда это повысит производительность приложения.
15. Деструкторы. Сборка «мусора».
Основные понятия в объектно-ориентированном программировании ИЛИ
моя шпаргалка по ООП
Jan 20, 2015 · 6 min read
С целью освежения базовых знаний по ООП, я решила перечитать потрясающую книгу «Объектно-ориентированный анализ и проектирование с примерами приложений», Гради Буч
Я обожаю эту книгу, потому что она написана простым языком со знанием дела и такой любовью к программированию, что вы ее с упоением прочтете в метро. Вы будете с нетерпением ждать того момента, когда вы сможете усесться с книжечкой в поезде и взахлеб читать и пропускать свои станции.
А теперь для ленивых и для себя любимой я составила краткий конспект-шпаргалку по этой книги.
ШПАРГАЛКА ПО ООП
Объектно-ориентированное программирование или ООП — это способ создания программных компонентов, базирующихся на объектах.
Основные принципы ООП
А б страгирование — это процесс выделения наиболее существенных характеристик некоторого объекта, отличающих его от всех других видов объектов, важных с точки зрения дальнейшего рассмотрения и анализа, и игнорирование менее важных или незначительных деталей.
Объекты и классы — основные абстракции предметной области.
Инкапсуляция — это процесс отделения друг от друга элементов объекта, определяющих его устройство и поведение; инкапсуляция служит для того, чтобы изолировать контрактные обязательства абстракции от их реализации.
Модульность — это свойство системы, связанное с возможностью ее декомпозиции на ряд внутренне сильно сцепленных, но слабо связанных между собой подсистем (частей).
Модульность снижает сложность системы, позволяя выполнять независимую разработку ее отдельных частей.
Иерархия — это упорядочение абстракций, расположение их по уровням.
Типизация — способ защититься от использования объектов одного класса вместо другого, или, по крайней мере, управлять таким использованием.
Тип — точная характеристика некоторой совокупности однородных объектов, включающая структуру и поведение.
При строгой типизации (например, в языке Оберон) запрещается использование объектов неверного типа, требуется явное преобразование к нужному типу. При менее строгой типизации такого рода запреты ослаблены. В частности, допускается полиморфизм — многозначность имен. Одно из проявлений полиморфизма, использование объект подтипа (наследника) в роли объекта супертипа (предка).
Параллелизм — это свойство, отличающее активные объекты от пассивных.
Параллелизм — наличие в системе нескольких потоков управления одновременно. Объект может быть активен, т. е. может порождать отдельный поток управления. Различные объекты могут быть активны одновременно.
Сохраняемость (устойчивость) — способность объекта существовать во времени, переживая породивший его процесс, и (или) в пространстве, перемещаясь из своего первоначального адресного пространства.
Устойчивость — способность объекта сохранять свое существование во времени и/или пространстве (адресном, в частности при перемещении между узлами вычислительной системы). В частности, устойчивость объектов может быть обеспечена за счет их хранения в базе данных.
Основные понятия объектно-ориентированного подхода или элементы объектной модели
“ Объект в ООП — это сущность, способная сохранять свое состояние (информацию) и обеспечивающая набор операций (поведение) для проверки и изменения этого состояния. ”
Объект — осязаемая сущность (tangible entity) — предмет или явление (процесс), имеющие четко выраженные границы, индивидуальность и поведение.
Любой объект обладает состоянием, поведением и индивидуальностью.
Состояние объекта определяется значениями его свойств (атрибутов) и связями с другими объектами, оно может меняться со временем.
Поведение определяет действия объекта и его реакцию на запросы от других объектов. Поведение представляется с помощью набора сообщений, воспринимаемых объектом (операций, которые может выполнять объект).
Индивидуальность — это свойства объекта, отличающие его от всех других объектов.
Структура и поведение схожих объектов определяют общий для них класс.
Объект в JavaScript создаётся с помощью функции Object.create. Эта функция из родителя и опционального набора свойств создаёт новую сущность. Пока что мы не будем беспокоиться о параметрах.
Прототип — это объект-образец, по образу и подобию которого создаются другие объекты. Объекты-копии могут сохранять связь с родительским объектом, автоматически наследуя изменения в прототипе; эта особенность определяется в рамках конкретного языка.
Класс — это множество объектов, связанных общностью свойств, поведения, связей и семантики. Любой объект является экземпляром класса. Определение классов и объектов — одна из самых сложных задач объектно-ориентированного проектирования.
Класс (class) — это группа данных и методов(функций) для работы с этими данными. Это шаблон. Объекты с одинаковыми свойствами, то есть с одинаковыми наборами переменных состояния и методов, образуют класс.
Конструктор класса — специальный блок инструкций, вызываемый при создании объекта.
Деструктор — специальный метод класса, служащий для деинициализации объекта (например освобождения памяти).
Атрибут — поименованное свойство класса, определяющее диапазон допустимых значений, которые могут принимать экземпляры данного свойства. Атрибуты могут быть скрыты от других классов, это определяет видимость атрибута: рublic (общий, открытый); private (закрытый, секретный); protected (защищенный).
Требуемое поведение системы реализуется через взаимодействие объектов. Взаимодействие объектов обеспечивается механизмом пересылки сообщений. Определенное воздействие одного объекта на другой с целью вызвать соответствующую реакцию называется операцией или посылкой сообщения. Сообщение может быть послано только вдоль соединения между объектами. В терминах программирования соединение между объектами существует, если один объект имеет ссылку на другой.
Дескриптор — это атрибут объекта со связанным поведением (англ. binding behavior), т.е. такой, чьё поведение при доступе переопределяется методами протокола дескриптора.
Операция — это услуга, которую можно запросить у любого объекта данного класса. Операции реализуют поведение экземпляров класса. Описание операции включает четыре части: имя; список параметров; тип возвращаемого значения; видимость.
Реализация операции называется методом.
Метод — это функция или процедура, принадлежащая какому-то классу или объекту.
Различают простые методы и статические методы (методы класса):
Методы предоставляют интерфейс, при помощи которого осуществляется доступ к данным объекта некоторого класса, тем самым, обеспечивая инкапсуляцию данных.
В зависимости от того, какой уровень доступа предоставляет тот или иной метод, выделяют:
Такое разделение интерфейсов позволяет сохранять неизменным открытый интерфейс, но изменять внутреннюю реализацию.
Полиморфизм — способность скрывать множество различных реализаций под единственным общим именем или интерфейсом.
Понятие полиморфизма может быть интерпретировано, как способность объекта принадлежать более чем одному типу.
Интерфейс — это совокупность операций, определяющих набор услуг класса или компонента. Интерфейс не определяет внутреннюю структуру, все его операции открыты.
Компонент — это относительно независимая и замещаемая часть системы, выполняющая четко определенную функцию в контексте заданной архитектуры.
Компонент представляет собой физическую реализацию проектной абстракции и может быть: компонентом исходного кода (cpp-шник); компонентом времени выполнения (dll, ActiveX и т. п.); исполняемый компонентом (exe-шник). Компонент обеспечивает физическую реализацию набора интерфейсов. Компонентная разработка (component-based development) представляет собой создание программных систем, состоящих из компонентов (не путать с объектно-ориентированным программированием (ООП).
Компонентная разработка — технология, позволяющая объединять объектные компоненты в систему.
Пакет — это общий механизм для организации элементов в группы. Это элемент модели, который может включать другие элементы. Каждый элемент модели может входить только в один пакет.
-средством организации модели в процессе разработки, повышения ее управляемости и читаемости;
-единицей управления конфигурацией.
Подсистема — это комбинация пакета (может включать другие элементы модели) и класса (обладает поведением). Подсистема реализует один или более интерфейсов, определяющих ее поведение. Она используется для представления компонента в процессе проектирования.