Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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 — динамическое управление памятью. В С/С++ динамические переменные должен создавать и следить за их корректным использованием и уничтожением программист. Динамические переменные создаются в куче — структуре данных, с помощью которой реализована динамически распределяемая память.
|