Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Основные принципы объектно-ориентированного программирования. Инкапсуляция, полиморфизм, наследование. Реализация ООП в современных языках программирования





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

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

[Целью инкапсуляции является обеспечение согласованности внутреннего состояния объекта.] В C# для инкапсуляции используются публичные свойства и методы объекта. Переменные, за редким исключением, не должны быть публично доступными.

Модификатор — средство ограничения доступа к членам класса. В зависимости от того, какой уровень доступа нужно предоставлять члену класса, выделяют модификаторы:

• public — обеспечение доступа из любого места программы.

• internal — ограничение видимости внутри сборки (сборка — код программы после компиляции). // в C#

• protected — обеспечение доступа наследникам, но запрет доступа пользователю.

• private — обеспечение доступа только внутри класса.

Классы могут наследоваться друг от друга. Класс-наследник (потомок) — класс, включающий члены своего суперкласса (некоторые или все). Класс-родитель (базовый / суперкласс) — класс, на основе которого создаются другие классы.

Класс-потомок получает все поля и методы класса-родителя, но может дополнять их собственными, либо переопределять уже имеющиеся.

Большинство языков программирования поддерживает только единичное наследование (класс может иметь только один класс-родитель), лишь в некоторых допускается множественное наследование — порождение класса от 2 или более классов-родителей.

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

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

Взаимодействие объектов в большинстве случаев обеспечивается вызовом ими методов друг друга.

“Object” — исходный базовый класс всех классов. Класс без родителей наследует класс “Object”. Класс без конструкторов автоматически наследует конструктор класса “Object”.

Полиморфизм («поли» — много, «морф» — форма; многоформность) — возможность использования одинаковых (тождественных) имен для различных членов класса.

В ООП проявляется в 3 видах:

• Возможность использования тождественных имен в различных классах.

• Перегрузка. Возможность использования тождественных имен в рамках одного класса.

• Аппарат виртуальных методов. Переопределение виртуальных методов в наследниках.

Смысл полиморфизма: «один интерфейс — множество реализаций». Например, реализация суперкласса может быть изменена в его наследниках.

2. Функции и процедуры в языках программирования. Передача параметров по значению и по ссылке. Использование в различных языках программирования.

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

Сравнение процедур и функций. 1) Функция может возвращать значение, процедура чаще не возвращает ничего (в Си возвращает пустое значение). 2) В теле функции обязательно наличие оператора, возвращающего значение. 3) Процедура вызывается отдельным оператором, вызов функции возможен в составе выражений. 4) На блок-схеме процедура изображается в блоке «предопределенный процесс», функция — в блок «процесс» или «вывод».

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

Процесс отладки программы, содержащей функции, можно лучше структурировать. Часто используемые функции можно помещать в библиотеки.

Тип функции определяется типом возвращаемого значения и списком типов её формальных параметров.

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

<модификатор> <тип> <имя функции>

(<список формальных параметров>)

{

<тело функции>

}

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


3. Перегрузка операций и функций в языке С++.

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

const char operator +(const char left, const char right)

{

return strcat(left, right);

}

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

main()

{

cout << volume(10);

cout << volume(2.5, 8);

cout << volume(100, 75, 15);

}

int volume(int s) // volume of a cube

{

return(s * s * s);

}

double volume(double r, int h) // volume of a cylinder

{

return(3.14 * r * r * h);

}

long volume(int a, int b, int h) // volume of a parallelepiped

{

return(a * b * h);

}

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

4. Переменные в языках программирования. Имя, тип и значение переменной. Область видимости и время жизни переменной. Динамические переменные.

Переменная — это именованная область памяти, в которой хранятся данные определенного типа (с объектной точки зрения, переменная — экземпляр типа).

Значение — данные, хранимые в переменной. Имя — идентификатор переменной для доступа к области памяти, в которой хранится значение. Тип — множество допустимых значений, которое может принимать переменная.

Имя и тип задаются при объявлении переменной и остаются неизменными на все время ее жизни. Значение переменной может меняться в ходе выполнения программы, эта возможность вариации значений и дала имя понятию "переменная" (variable) в математике и программировании. Константа — переменная с неизменяемым значением.

Получение начального значения переменной называется ее инициализацией. В C# обязательна инициализация переменной до начала ее использования.

Область видимости — место в коде программы, где может использоваться переменная.

Время жизни переменной — период выполнения программы с момента выделения места в оперативной памяти для переменной до момента освобождения этой памяти.

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

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

Параметр Видимость / типизация Место хранения Область видимости Время жизни
Локальная Стек Блок От создания до конца
Статическая Область данных Блок От создания до конца
Глобальная Область данных Программа От создания до конца
Динамическая Куча Переменная-указатель От создания до удаления

Тип Описание типа Размер(байты)

Integer Целое (со знаком) 4

Boolean Логический тип 1

Single Вещественный (дробный) 4

Double Вещественный (дробный) 8

Char Символ 1

String Строковый тип

Byte Однобайтовое поле знака 1

Динамические переменные — переменные, которые создаются (и уничтожаются) во время выполнения программы. В зависимости от того, кто отвечает за работу с такими переменными — компилятор или программист — различают языки с динамическим или статическим управлением памятью.

Pascal, С/С++ — статическое управление памятью. ALGOL-60, PL/I — динамическое управление памятью. В С/С++ динамические переменные должен создавать и следить за их корректным использованием и уничтожением программист.

Динамические переменные создаются в куче — структуре данных, с помощью которой реализована динамически распределяемая память.


Date: 2015-09-22; view: 1206; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию