Класс это конструкция языка программирования предназначенная для сокращения размера программы
Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.
Основы Объектно-Ориентированного Программирования
Выделяют три основных “столпа” ООП- это инкапсуляция, наследование и полиморфизм.
Инкапсуляция
Инкапсуляция предполагает два основных момента:
- сокрытие деталей реализации;
- связывание данных и методов для их обработки в одном месте.
Наследование
Полиморфизм
Классы
Далее, мы подробно остановимся на каждом из перечисленных составляющих класса.
Создадим объект класса DemoClass :
С методами встроенных типов мы уже встречались ранее, например, метод поиска элемента в строке, или преобразование строки в число и т.п.
Модификаторы доступа
Модификаторы доступа определяют область видимости как непосредственно самого класса, так и его составляющих (поля, свойства, методы).
Модификатор public :
- для класса: указывает на то, что класс доступен снаружи из сборки;
- для составляющих класса: указывает на то, что они могут быть доступны вне класса, к ним можно получить доступ из любого места в программе.
Модификатор private :
- для класса: указывает на то, что класс доступен только внутри сборки.
- для составляющих класса: указывает на то, что они доступны только внутри класса.
Если модификатор не указан, то будет использован private .
Конструктор класса
Вот так будет выглядеть самый простой вариант конструктора для класса DemoClass :
Про конструктор класса нужно знать следующее:
- Конструктор можно не создавать явно, тогда для класса будет создан конструктор по умолчанию, он выглядит следующим образом:
- Конструкторов может быть несколько, они должны отличаться по количеству и типу принимаемых аргументов:
- Если вы создадите конструктор, который содержит набор аргументов, то конструктор по умолчанию уже не будет создан для класса. Если вы хотите создавать объекты без указания аргументов, то необходимо добавить в класс соответствующий конструктор.
Инициализация объектов класса
Инициализация объекта класса производится с помощью ключевого слова new . Создадим объект класса DemoClass :
Если у класса есть несколько конструкторов, то при инициализации можно выбрать один из существующих:
Доступна возможность использования неявного объявления с помощью ключевого слова var :
Если у класса есть публичные свойства, то им можно присвоить значения при инициализации:
Методы
Методом класса называют функцию или процедуру, которая принадлежит классу или объекту. Отличие функции от процедуры в том, что функция возвращает значение, а процедура нет. В общем виде синтаксис объявления метода выглядит следующим образом:
Работа с модификатором доступа
Если метод объявлен с модификатором public , то его можно использовать вне класса, например метод Printer из DemoClass :
Такой метод может вызываться в любом месте программы у соответствующих объектов:
Если мы объявим метод с модификатором private или без модификатора (тогда, по умолчанию, будет принят private ), то его уже нельзя будет вызвать снаружи класса:
(Код в методе Main ):
Но при этом внутри класса его вызвать можно:
Статические методы и методы объекта
Вызовем эти методы из класса DemoClass в методе Main :
Методы принимающие аргументы и возвращающие значения
Как было сказано в начале данного раздела, методы могут принимать данные через аргументы и возвращать значения, продемонстрируем эту возможность на примере:
(Код в Main ):
Поля
Поле представляет собой переменную любого типа, объявленную внутри класса. Через модификатор доступа можно управлять уровнем доступа к полю (так же как для методов), через ключевое слово static можно определять принадлежность поля объекту либо классу:
(Код в Main ):
Создадим для класса Building методы для доступа и модификации значения поля height :
Для работы с этим классом воспользуемся следующим кодом:
Свойства
Добавим в класс Building следующую конструкцию:
Для демонстрации работы с этим свойством напишем следующий код:
С ними можно работать также как и с Height .
Ключевое слово this
В теле данного метода мы должны как-то явно задать, что значение этого аргумента будет присвоено приватному полю height , записать height = height мы не можем, так как в этом случае нет четкого понимания, что чему будет присваиваться. В этом случае, для явного указания, что мы хотим присвоить значение полю класса, следует использовать ключевое слово this так, как мы это реализовали в методе SetHeight :
Ключевое слово static
В предыдущих разделах мы уже сталкивались с понятием статического метода и поля. Ещё раз обговорим этот момент. Если метод, поле или свойство имеет модификатор static , то это означает что они принадлежат уровню класса, а не объекту. То есть для работы с соответствующими элементами не нужно создавать экземпляр класса, можно работать напрямую через имя класса. Если класс объявлен с ключевым словом static , то такой класс называют статическим, он обладает следующими особенностями:
- у такого класса все методы должны быть статическими;
- его нельзя наследовать (класс является запечатанным);
- класс не может содержать конструкторы экземпляров;
- нельзя создавать экземпляры таких классов.
Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.
Волею судьбы мне приходится читать спецкурс по паттернам проектирования в вузе. Спецкурс обязательный, поэтому, студенты попадают ко мне самые разные. Конечно, есть среди них и практикующие программисты. Но, к сожалению, большинство испытывают затруднения даже с пониманием основных терминов ООП.
Для этого я постарался на более-менее живых примерах объяснить базовые понятия ООП (класс, объект, интерфейс, абстракция, инкапсуляция, наследование и полиморфизм).
Первая часть, представленная ниже, посвящена классам, объектам и интерфейсам.
Вторая часть иллюстрирует инкапсуляцию, полиморфизм и наследование
Основные понятия ООП
Класс
Представьте себе, что вы проектируете автомобиль. Вы знаете, что автомобиль должен содержать двигатель, подвеску, две передних фары, 4 колеса, и т.д. Ещё вы знаете, что ваш автомобиль должен иметь возможность набирать и сбавлять скорость, совершать поворот и двигаться задним ходом. И, что самое главное, вы точно знаете, как взаимодействует двигатель и колёса, согласно каким законам движется распредвал и коленвал, а также как устроены дифференциалы. Вы уверены в своих знаниях и начинаете проектирование.
Вы описываете все запчасти, из которых состоит ваш автомобиль, а также то, каким образом эти запчасти взаимодействуют между собой. Кроме того, вы описываете, что должен сделать пользователь, чтобы машина затормозила, или включился дальний свет фар. Результатом вашей работы будет некоторый эскиз. Вы только что разработали то, что в ООП называется класс.
Класс – это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт).
С точки зрения программирования класс можно рассматривать как набор данных (полей, атрибутов, членов класса) и функций для работы с ними (методов).
С точки зрения структуры программы, класс является сложным типом данных.
В нашем случае, класс будет отображать сущность – автомобиль. Атрибутами класса будут являться двигатель, подвеска, кузов, четыре колеса и т.д. Методами класса будет «открыть дверь», «нажать на педаль газа», а также «закачать порцию бензина из бензобака в двигатель». Первые два метода доступны для выполнения другим классам (в частности, классу «Водитель»). Последний описывает взаимодействия внутри класса и не доступен пользователю.
В дальнейшем, несмотря на то, что слово «пользователь» ассоциируется с пасьянсом «Косынка» и «Microsoft Word», мы будем называть пользователями тех программистов, которые используют ваш класс, включая вас самих. Человека, который является автором класса, мы будем называть разработчиком.
Объект
Вы отлично потрудились и машины, разработанные по вашим чертежам, сходят с конвейера. Вот они, стоят ровными рядами на заводском дворе. Каждая из них точно повторяет ваши чертежи. Все системы взаимодействуют именно так, как вы спроектировали. Но каждая машина уникальна. Они все имеют номер кузова и двигателя, но все эти номера разные, автомобили различаются цветом, а некоторые даже имеют литьё вместо штампованных дисков. Эти автомобили, по сути, являются объектами вашего класса.
Объект (экземпляр) – это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом.
Говоря простым языком, объект имеет конкретные значения атрибутов и методы, работающие с этими значениями на основе правил, заданных в классе. В данном примере, если класс – это некоторый абстрактный автомобиль из «мира идей», то объект – это конкретный автомобиль, стоящий у вас под окнами.
Интерфейс
Когда мы подходим к автомату с кофе или садимся за руль, мы начинаем взаимодействие с ними. Обычно, взаимодействие происходит с помощью некоторого набора элементов: щель для приёмки монеток, кнопка выбора напитка и отсек выдачи стакана в кофейном автомате; руль, педали, рычаг коробки переключения передач в автомобиле. Всегда существует некоторый ограниченный набор элементов управления, с которыми мы можем взаимодействовать.
Интерфейс – это набор методов класса, доступных для использования другими классами.
Очевидно, что интерфейсом класса будет являться набор всех его публичных методов в совокупности с набором публичных атрибутов. По сути, интерфейс специфицирует класс, чётко определяя все возможные действия над ним.
Хорошим примером интерфейса может служить приборная панель автомобиля, которая позволяет вызвать такие методы, как увеличение скорости, торможение, поворот, переключение передач, включение фар, и т.п. То есть все действия, которые может осуществить другой класс (в нашем случае – водитель) при взаимодействии с автомобилем.
При описании интерфейса класса очень важно соблюсти баланс между гибкостью и простотой. Класс с простым интерфейсом будет легко использовать, но будут существовать задачи, которые с помощью него решить будет не под силу. В то же время, если интерфейс будет гибким, то, скорее всего, он будет состоять из достаточно сложных методов с большим количеством параметров, которые будут позволять делать очень многое, но использование его будет сопряжено с большими сложностями и риском совершить ошибку, что-то перепутав.
Примером простого интерфейса может служить машина с коробкой-автоматом. Освоить её управление очень быстро сможет любая блондинка, окончившая двухнедельные курсы вождения. С другой стороны, чтобы освоить управление современным пассажирским самолётом, необходимо несколько месяцев, а то и лет упорных тренировок. Не хотел бы я находиться на борту Боинга, которым управляет человек, имеющий двухнедельный лётный стаж. С другой стороны, вы никогда не заставите автомобиль подняться в воздух и перелететь из Москвы в Вашингтон.
Что такое атрибуты и зачем они нужны?
Нужен человек, который может объяснить, что такое атрибуты и зачем они нужны, на как можно более.
Что такое hash-таблицы, и зачем они нужны?
Обьясните пожалуста по простому что такое хеш таблици и зачем они надо. пытался разобратся с ними.
Что такое комплекты инициализации и зачем они нужны?
Что такое комплекты инициализации и зачем они нужны? Например комплект инициализации к Xerox.
Во вторых, для удобства.
ИМХО KillJoy, Ну представь, тебе нужна машина, приходишь в магазин а тебе:
1. "вон куча деталей валяется, собирай" - это процедурное программирование
2. "вот ключи, а вот машина, садись и езжай" - это классы
как то так )
Класс - это, своего рода, родитель. Он имеет основные свойства и реакции. Например мама. Человек, умеет готовить, стирать, убираться, ругать, хвалить. Вы - потомок (компонент) умеете все, что и мама, но и еще чуть-чуть (в носу ковырять).
Я так это понял.
KillJoy, Если говорить более приближенно к программированию, то получается вот что.Вот пишешь ты программу, в ней содержится куча каких то функциональных частей, которые ты собираешь воедино для получения какого то результата.
Какие приемущества при использовании классов:
1. Если тебе нужно поменять какой то кусок кода (ну например формат каких то данных вдруг изменился), ты не ищешь по всей программе на что это изменение может повлиять, ты правишь только один из классов.
2. Допустим у тебя появилась задача написать еще одну программу, которая содержит некоторые элементы, которые были в предыдущей. Копируешь ты кусок кода и начинаешь его нудно отлаживать ища откуда какая переменная у тебя бралась и куда что нужно засунуть. Если у тебя эта часть оформлена как класс, то просто копируешь файлы и можешь уже его использовать не вспоминая подробностей расчетов.
ну и т.д.
Классы позволяют создавать объекты - вещи в себе. Объект имеет внутри данные (хотя вы как его пользователь можете не знать о них == инкапсуляция), и выполняет свое предназначение через методы. Это методы будут компактнее чем обычные процедуры, потому как некоторые данные им передавать уже не нужно - они уже внутри объекта класса.
Теперь представим ситуацию что данный Вася является гланым объектом программы (программа сделала для Васи!) и нам нужно часто получать данные по его счету.
В процедурном стили мы бы просто завели переменную Счет и по коду использовали её. Однако настал тот час когда Вася захотел завести дополнительный счет. И теперь везде где в коде есть упоминание о переменной счет нам надо заменить её на (Счет+ДопСчет). В стиле ООП мы бы сделали так:
В итоге пришлось переписать лишь сам класс (4 строчки), и место где объект создается (1 строчка).
Можно сказать что в данном мы могли бы просто создать процедуру ПолучитьСчет которая использовала бы глобальные данные. Но кто знает, может завтра Вася попросит добавить в программу его друга?
ООП - это ряд ограничений, некий паттерн, который может быть достигнут даже в языках которые не поддерживают ООП. Эти ограничения вполне разумны и помогают писать более грамотный, расширяемый код. Кроме того разграничивание кода на классы позволяет строить модульные системы. Но это не означает что ООП всегда уместен.
Независимо от того, какой язык программирования вы собираетесь изучать: PHP, Javascript или др. языки программирования, при изучении объектно-ориентированного подхода к программированию, обязательно нужно разобраться с понятиями класса и объекта.
Из предыдущего видео мы знаем, что самым главным действующим лицом в объектно-ориентированном подходе программирования является объект, у которого есть какие-то свойства (т.е. характеристики этого объекта), значения этих свойств и методы, те действия, которые этот объект может совершать.
Но, для того, чтобы в нашей программе появился объект, нужно совершить два действия:
1) Его нужно описать. Какие свойства и методы есть у этого объекта.
2) Его нужно создать
Что значит описать объект? Описание объекта – это определение его свойств и методов, которые этот объект может принимать. Т.е. мы начинаем создавать программу и пишем, что у нас будет некий объект (например, Employee или Работник).
У этого объекта будет свойства first_name (имя), last_name (фамилия), age (возраст).
Этот объект при запросе к нему может выдавать его имя (getFirstName()), фамилию getLastName()), возраст (getAge()).
Обратите внимание, что в конце метода ставятся круглые скобки (). Они обозначают то, что это является методом. Остальное является свойствами, характеристиками объекта.
Что же значит создать объект?
Создание объекта – это некий процесс обращения к конкретному экземпляру описанного объекта. После описания объекта он имеет некую абстрактную форму и когда мы обращаемся к какому-то конкретному работнику, к какому-то конкретному экземпляру этого описания: работник 1, работник 2, работник 3. У нас может быть множество работников, которые соответствуют этой схеме.
Когда мы с вами обращаемся к какому-то конкретному экземпляру этой сущности работника, то мы создаем некий объект, т.е. некий экземпляр существующего описания этого объекта.
Тот программный код, который содержит описательную часть объекта, он называется класс. Часть, в которой мы описываем объект – это называется классом. Т.е. класс – это некая сущность, которая описываем, что будут собой представлять все те экземпляры, которые будут создаваться из этого класса.
Экземпляры классов = объекты.
Объект – это просто что-то конкретное, а класс – это некое абстрактное понятие, которое просто содержит описательную часть.
Класс – это что-то вроде чертежа объекта, т.е. прежде чем мы создадим какую-то деталь, проектировщик должен сделать ее чертеж. Написать, что у этой детали будут такие-то свойства (высота, ширина, длина). Когда чертеж будет выполнен, мы отдаем его какому-то мастеру, и он уже создает экземпляры из этого класса. Деталей, которые могут быть созданы из этого чертежа огромное количество.
Также и в программировании: класс у нас один, а экземпляров этого класса, объектов может быть огромное количество.
И нужно понимать, что
Чертеж НЕ равно деталь
Класс НЕ равно объект
Общий алгоритм работы с объектно-ориентированным подходом в программировании:
- Создали класс
- Создали экземпляр класса (объект)
- Обращаемся к свойствам и методам экземпляра класса.
Конечно, сейчас многое может быть с этим не понятно, но здесь важно приступить к практике и посмотреть на конкретных примерах, как это работает.
Читайте также: