Перегрузка и полиморфные переменные

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

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

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

Синтаксис перегрузки.Синтаксис перегрузки операторов очень похож на определение функции с именем operator@, где @ — это идентификатор оператора (например +, -, <<, >>).

простейшийпример:

class Integer

{

private:

int value;

public:

Integer(int i): value(i)

{}

const Integer operator+(const Integer&rv) const {

return (value + rv.value);

}

};

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

28.Generic-классы и методы, особенности применения.

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

Какие же преимущества дает использование общих типов?

1.Наиболее очевидное - повторное использование кода. Нет необходимости создавать два идентичных класса, отличающихся только типами параметров, достаточно создать один с параметризованными типами. При этом использование параметризованных типов позволяет создавать единый программный код для работы с различными типами данных. Например, единожды написанный алгоритм может работать и с целыми числами и с числами с плавающей десятичной точкой, при этом не производя на каждом шаге проверку/приведение типа. Так Generics вытесняют классы объявленные с использованием типа object.

2.Повышение производительности кода по сравнению с использование параметров типа object - нет необходимости выполнять приведение, как уже сказано выше, на каждом шаге, за счет чего получается выигрыш в производительности.

3.Проверка типов в момент компиляции программы. Поскольку не используются параметры типа object, то компилятор может выполнить проверку типа каждого параметра в момент компиляции, поскольку типы для Generic классов жестко задаются в момент объявления переменных классов этого типа.

29.Понятие расширяемого программирования. Принципы расширяемого программирования.

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

Сборочное программирование тесно связано с методом повторного использования кода, причем как исходного, так и бинарного.

Объектно-ориентированное сборочное программирование. Подход базируется на методологии объектно-ориентированного программирования и предполагает распространение библиотек классов в виде исходного кода или упаковку классов в динамически компонуемую библиотеку.

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

Встраивание сторонними разработчикаминовой функциональности в систему

Без привлечения разработчиков системы

Без модификации исходного кода системы

Без перекомпиляции, переустановки и перезагрузки существующих модулей системы

Без согласования с другими сторонними разработчиками

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

Расширение данных.Новый модуль дополняет существующие объекты новыми свойствами

Дополнение расширяет все экземпляры определенного типа данных

Память под дополнение выделяется на лету в момент первого обращения к нему

Дополнения могут расширять лишь записи, создаваемые в динамической памяти

Дополнения ортогональны «наследованию» и могут создаваться в любом количестве и для любого типа данных в иерархии

30.Достоинства и недостатки объектно-ориентированного программирования.

Достоинства:

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

2. Данные и операции над ними образуют определенную сущность, и описываются вместе. Что улучшает наглядность и удобство сопровождения.

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

4. ООП дает возможность создавать расширяемые системы. Компоненты могут быть добавлены на этапе исполнения программы.

5. Обработка разнородных структур данных. Программы могут работать, не различая вида объектов, что существенно упрощает код. Новые виды могут быть добавлены в любой момент.

6. Изменение поведения во время исполнения. На этапе исполнения один объект может быть заменен другим, что позволяет легко адаптировать алгоритм .

7. Реализация работы с наследниками. Алгоритмы можно обобщить настолько, что они уже смогут работать более чем с одним видом объектов.

8. Создание «каркаса». Независимые от приложения части предметной области могут быть реализованы в виде набора универсальных классов, или каркаса (framework).

9. Сокращается время на разработку.

10. Компоненты многоразового использования содержат меньше ошибок, чем новые.

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

12. Если программа опирается на стандартные компоненты, ее структура и пользовательский интерфейс становятся более унифицированными.

Недостатки:

1. Документирование классов — ресурсоёмкая задача.

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

3. Методы, как правило, короче процедур, но их больше. В коротких методах легче разобраться, но код обработки для иногда находится в других методах.

4. Злоупотребление инкапсуляцией данных. Чем больше логики и данных скрыто в недрах класса, тем сложнее его расширять.

5. Неэффективность на этапе выполнения, в т.ч. инкапсуляция данных.

6. Неэффективность в смысле распределения памяти.

7. Излишняя универсальность.

ООП. Оглавление

1. Основные этапы проектирования программ. Понятия интерфейса и внутренней реализации.

2. Концепция АТД. Объекты и классы. Понятия состояния, поведения и идентификации объекта.

3. Парадигмы программирования: процедурное, модульное, объектно-ориентированное. Основные отличия.

4. Отношения между классами: ассоциация, агрегация, композиция, использование, наследование.

5. Необязательные принципы ООП: типизация, параллелизм, сохраняемость. 4

6. Отношения между объектами: взаимодействие клиент-сервер. 4

7. Отношения между объектами: иерархии объектов. 4

8. Базовые принципы ООП: инкапсуляция, наследование, полиморфизм. Примеры применения.

9. Понятие класса, понятие объекта. Понятие членов экземпляра класса и члена класса. 4

10. Классификация методов объекта в ООП. 4

11. Идентичность и жизненный цикл объекта. 4

12. Управление доступом к компонентам класса. Применение атрибутов доступа к классам, свойствам и методам классов. 4

13. Одиночное и множественное наследование классов и интерфейсов, примеры использования.

14. Управление доступом к компонентам класса при наследовании. 4

15. Приведение типов при наследовании. 4

16. Полиморфизм и понятие виртуальных методов. 4

17. Создание и уничтожение объектов. Конструкторы и деструкторы. 4

18. Переопределение методов, влияние атрибутов доступа при переопределении методов. 4

19. Понятие абстрактных классов и методов. 4

20. Использование абстракции при наследовании. 4

21. Статические поля и методы классов. 4

22. Понятие исключительной ситуации. Классификация исключений. 4

23. Способы обработки ошибок. Выбрасывание и перехват исключений. Разработка кода, безопасного к возникновению исключений. 4

24. Способы защиты от утечки ресурсов в случае возникновения исключительных ситуаций. 4

25. Генерирование исключительной ситуаций, создание пользовательских исключительных ситуаций. 4

26. Понятие перегрузки методов, разрешение перегрузки. 4

27. Понятие перегрузки операторов. 4

28. Generic-классы и методы, особенности применения. 4

29. Понятие расширяемого программирования. Принципы расширяемого программирования. 4

30. Достоинства и недостатки объектно-ориентированного программирования. 4

Наши рекомендации