Автор: Widowmaker1984

Вопрос 26 (основные принципы ООП)

"Назовите принципы ООП и расскажите о каждом."

1. Есть четыре основные характеристики ООП:
- Абстракция
- Инкапсуляция
- Наследование
- Полиморфизм

2. Абстракция — это разработка классов, исходя из предоставляемой ими функциональности; а не из деталей их реализации. Такое разделение может быть выражено через специальный «интерфейс», сосредотачивающий описание всех возможных применений программы. Абстракция упрощает код, скрывая несущественные детали.

2.1. С точки зрения программирования абстракция — это правильное разделение программы на объекты. Это четкое определение концептуальных границ объекта в виде отличающих его от других объектов характеристик.

скрытый текст2.2. Такой подход является основой ООП. Он позволяет работать с объектами, не вдаваясь в особенности их реализации. В каждом конкретном случае применяется тот или иной более частный подход: инкапсуляция, полиморфизм или наследование. Например, при необходимости обратиться к скрытым данным объекта, следует воспользоваться инкапсуляцией, создав, так называемую, функцию доступа или свойство.

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

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

3.2. Инкапсуляция выступает договором для объекта, что он должен скрыть, а что открыть для доступа другими объектами. При этом пользователю для взаимодействия с объектом предоставляется только спецификация (интерфейс) объекта. Реализуется с помощью ключевого слова: public. Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов: private, protected, internal.

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

4.1. Наследование обычно возникает, когда все объекты одного класса одновременно являются объектами другого класса (отношение общее/частное). Например, все объекты класса Студент являются объектами класса Человек. В этом случае говорят, что класс Студент наследует от класса Человек. Аналогично класс Собака может наследовать от класса Животное, а класс Далматинец от класса Собака. Класс, который наследует, называется подклассом или потомком, а класс, от которого наследуют, называется суперклассом или предком.

4.1.1. Если класс №2 является потомком класса №1, а класс №3 является потомком класса №2, то класс №3 является также потомком класса №1.

4.2. Наследование избавляет программиста от лишней работы. Например, если в программе необходимо ввести новый класс Далматинец, его можно создать на основе уже существующего класса Собака, не программируя заново все поля и методы, а лишь добавив те, которых не хватало в суперклассе.

4.2.1. Однако наследование делает код сильно связанным. При желании изменить суперкласс, придется знать все детали подклассов, чтобы не разрушить код.


4.3. Для того, чтобы один класс был потомком другого, необходимо при его объявлении после имени класса указать ключевое слово extends и название суперкласса. Например:

class Dalmatian extends Dog {
// дополнительные поля и методы
}

скрытый текст4.3.1. Если ключевое слово extends не указано, считается, что класс унаследован от универсального класса Object.

5. Полиморфизм — это возможность класса выступать в роли любого из своих предков, несмотря на то, что в нем может быть изменена реализация любого из методов.

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

5.1.1. Пусть, к примеру, мы хотим расширить класс Dog классом BigDog, для того, чтобы наша программа особым образом моделировала поведение больших злых собак. В частности, большие собаки лают по-другому. Во-первых, громче, а во-вторых, они не умеют считать. Поэтому мы переопределим метод voice(). Теперь создадим в методе main() двух разных собак: обычную и большую и заставим их лаять.

Dog dog = new Dog("Тузик", 2);
dog.voice();
dog = new BigDog();
dog.voice();

Т.е. переменная dog имеет тип Dog, но в третьей строке она начинает указывать на объект класса BigDog, то есть БОЛЬШУЮ собаку, которая при вызове метода voice() будет лаять как БОЛЬШАЯ собака.

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

Комментарии


Лучшее   Правила сайта   Вход   Регистрация   Восстановление пароля

Материалы сайта предназначены для лиц старше 16 лет (16+)