
- •1 Рекурсия
- •2 Рекурсия и Итерация
- •3 Линейный поиск
- •4 Поиск делением пополам (двоичный поиск)
- •5 Сортировка
- •6 Сортировка простыми включениями.
- •7 Сортировка бинарными включениями
- •8 Сортировка простым выбором.
- •9 Сортировка простым обменом (метод пузырька)
- •10 Шейкер сортировка.
- •11 Сортировка включениями с убывающими приращениями (сортировка Шелла).
- •12 Сортировка с разделением (быстрая сортировка).
- •13 Ссылочные типы.
- •14 Динамические структуры данных
- •15 Создание и уничтожение динамических переменных
- •16. Связанные списки
- •17. Связанные списки. Создание очередного элемента. Просмотр списка
- •18. Добавление компонент в середину списка
- •19. Исключение компонент из середины списка
- •20. Рекурсивная обработка списка
- •Вопрос 21
- •22 Деревья.
- •23 Двоичные деревья.
- •24 Двоичное дерево поиска.
- •25 Добавление узла к двоичному дереву.
- •26 Поиск в двоичном дереве.
- •28 Удаление из дерева.
- •29 Деревья общего вида.
- •30 Становление ооп
- •Абстрагирование
- •Иерархия
- •31 Основные концепции
- •2 Наследование
- •3 Индивидуальность объекта.(Про это у меня вообще ничего нет)
- •32 Абстрактные типы данных
- •37 Виртуальные методы.
- •38 Позднее связывание.
- •39 Полиморфизм
- •40 Расширенная совместимость типов.
- •42 Динамические объекты
- •45 Необходимость виртуальных методов.
42 Динамические объекты
Переменные объектного типа могут быть динамическими, то есть размещаться в памяти только на время их использования. Для работы с динамическими объектами используется расширенный синтаксис процедур New и Dispose. Обе процедуры в этом случае содержат в качестве второго параметра вызов конструктора или деструктора для выделения или освобождения памяти переменной объектного типа:
New(P, Construct);
Или
Dispose(P. Destruct);
Где P — указатель на переменную объектного типа, a Construct и Destruct - конструктор и деструктор этого типа.
Действие процедуры New в случае расширенного синтаксиса равносильно действию следующей пары операторов:
New(P);
P.Construct;
Эквивалентом Dispose является следующее:
P^.Dispose;
Dispose(P);
Применение расширенного синтаксиса не только улучшает читаемость исходного кода, но и генерирует более короткий и эффективный исполняемый код.
43 Конструкторы/Деструкторы.
Чтобы использовать виртуальные методы, необходимо в описании объекта после заголовка метода добавить ключевое слово virtual. Заголовки виртуальных методов родителя и наследника должны в точности совпадать. Инициализация экземпляра объекта, имеющего виртуальные методы, должна выполняться с помощью специального метода — конструктора. Конструктор обычно присваивает полям объекта начальные значения и выполняет другие действия по инициализации объекта. В заголовке метода-конструктора слово procedure заменяется словом constructor. Действия, обратные действиям конструктора, выполняет еще один специальный метод — деструктор. Он описывается словом destructor.
Конструктор выполняет действия по подготовке позднего связывания. Эти действия заключаются в создании указателя на таблицу виртуальных методов, которая в дальнейшем используется для поиска методов. Таблица содержит адреса всех виртуальных методов. При вызове виртуального метода по его имени определяется адрес, а затем по этому адресу передается управление.
У каждого объектного типа имеется своя собственная таблица виртуальных методов, что и позволяет одному и тому же оператору вызывать разные процедуры. Если имеется несколько экземпляров объектов одного типа, то недостаточно вызвать конструктор для одного из них, а затем просто скопировать этот экземпляр во все остальные. Каждый объект должен иметь свой собственный конструктор который вызывается для каждого экземпляра. В противном случае возможен сбой в работе программы.
Замечу, что конструктор и деструктор могут быть и «пустыми», то есть не содержать операторов. Весь необходимый код в этом случае создается при трансляции ключевых слов constructor и destructor.
45 Необходимость виртуальных методов.
При отсутствии полиморфизма и виртуальных методов код программы вынужденно содержит множество операторов варианта. Пр-р: предположим необходимо просмотреть список компаний и
оценить их бюджет. При отсутствии ООП необходимо было бы определить параметр указывающий тип компании и использовать оператор варианта.
Procedure PrintRepert (Acomp:Company);
Begin
……………..
case Acompany id of
Commerc: PrintCommercBudget;
Non_Profit: PrintNon_ProfitBudget;
…………………
end;
Чтобы ввести новый вид компании необходимо модифицировать оператор варианта. В этом случаи увеличивается вероятность возникновения ошибок и проект становится не стабильным. Предположим мы написали такую программу и периодически используем ее для получения отчетов. Если изменится экономическая ситуация то ее надо будет редактировать самим. А если программа была куплена или заказана, то исходный код нам скорее недоступен.
Создание пакетов подпрограмм для продажи без исходного кода означает, что пакет может работать только с теми, которые определены разработчиками. Пользователь бессилен расширить функции, по направлению которые не были определены разработчиками. Решение проблемы заключается в применении расширенных правил совместимости ТР и создание прикладных программ, которые использовали бы полиморфные объекты и виртуальные методы.