Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

case FigureIdTage of

Point: DragPoint;

Circle: DragCircle;

Square: DragSquare;

Rectangle: DragRectangle;

Curve: DragCurve;

Конечно, включение семнадцати небольших кусков программы внутрь одного куска является небольшим шагом вперед, но при этом остается нерешенной следующая проблема: что делать, если пользователь пакета определит несколько новых графических фигур, например, пользователь разрабатывает дорожные знаки и хочет работать с восьмиугольником для знака остановки. Пакет не имеет типа Octagon (восьмиугольник), поэтому DragIt не имеет метку этого типа в предложении case и, следовательно, откажется нарисовать новую восьмиугольную фигуру. Если эту запись передать DragIt, то фигура типа Octagon должна попасть в часть else предложения case как нераспознанная фигура.

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

Выход состоит в использовании для объектов правил расширенной совместимости типов Turbo Pascal и проектировании прикладной задачи с использованием полиморфных объектов и виртуальных методов. Если процедура пакета DragIt написана так, чтобы она могла работать с полиморфными объектами, то она будет работать с любыми объектами, определенными внутри пакета - и с любыми порожденными объектами, которые Вы определили сами. Если типы объектов пакета используют виртуальные методы, то объекты и подпрограммы пакета могут работать с обычными графическими фигурами в собственных терминах этой фигуры. Виртуальный метод, который Вы определите сейчас, может вызываться файлом модуля. TPU пакета, который был написан и откомпилирован годом позже. Объектно-ориентированное программирование делает это возможным, а виртуальные методы являются ключом к решению этой проблемы.

НЕ нашли? Не то? Что вы ищете?

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

Контрольные вопросы

Какой тип объекта называется полиморфным? В чем же преимущество полиморфных объектов?

СРСП № 5

Тема: Параметризованные классы.

Цель: знать предназначение параметризованного класса

Шаблон (template) или параметризованный класс (parametrized class) предназначен для обозначения такого класса, который имеет один (или более) нефиксированный формальный параметр. Он определяет целое семейство или множество классов, каждый из которых может быть получен связыванием этих параметров с действительными значениями. Обычно параметрами шаблонов служат типы атрибутов классов, такие как целые числа, перечисление, массив строк и др. В более сложном случае формальные параметры могут представлять и операции класса.

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

Рис. 1. Графическое изображение шаблона на диаграмме классов

Шаблон не может быть непосредственно использован в качестве класса, поскольку содержит неопределенные параметры. Чаще всего в качестве шаблона выступает некоторый суперкласс, параметры которого уточняются в его классах-потомках. Очевидно, в этом случае между ними существует отношение зависимости с ключевым словом "bind", когда класс-клиент может использовать некоторый шаблон для своей последующей параметризации. В более частном случае между шаблоном и формируемым от него классом имеет место отношение обобщения с наследованием свойств шаблона (рис. 2). В данном примере отмечен тот факт, что класс "Адрес" может быть получен из шаблона Связный_список на основе актуализации формальных параметров "S, k, l" фактическими атрибутами "улица, дом, квартира".

Этот же шаблон может использоваться для задания (инстанцирования) другого класса, скажем, класса "Точки_на_плоскости". В этом случае класс "Точки_на_плоскости" актуализирует те же формальные параметры, но с другими значениями, например, <координаты_точки, х, у>. Концепция шаблонов является достаточно мощным средством в ООП, и поэтому ее использование в языке UML позволяет не только сократить размеры диаграмм, но и наиболее корректно управлять наследованием свойств и поведения отдельных элементов модели.

Рис.2. Пример использования шаблона на диаграмме классов

Контрольные вопросы

Для чего пердназначен  параметризированный класс? Что чаще всего выступает в качестве шаблона? Что позволяет использование концепция шаблонов в языке UML?

СРСП № 6

Тема: Реализация ООП в языке программирования

Цель: знать основные понятия

Язык Pascal был создан задолго до того, как выяснилось, что ООП становится de facto стандарной концепцией разработки программного обеспечения. Соответственно, появившиеся реализации ООП подхода на Pascal'е несут в себе отпечаток дообъектного прошлого этого языка.

Лидер разработок компиляторов паскаля в Borland Андрес Хейлсберг (Andres Heilsberg) решил ввести элементы ООП лишь в версию (5.5), а следующие версии сделать полностью ООП-ориентированными. К сожалению, полностью это так и не удалось.

Синтаксис

Для того, чтобы объявить класс на Pascal'е необходимо воспользоваться ключевым словом Object. Так как класс всегда является типом, делать это можно лишь в Type части программы:

Type
Class1 = Object

{список полей}
A: Byte;
V: Real;
{список методов}
Procedure Nothing(Var K: Byte);
End;

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

Var Object1, Object2: Class1;

Соотвенно, доступ к полям объекта некоторого класса производится аналогично доступу к полям записи:

Object1.V:= Object2.A;

Обращение к методам класса производится аналогичным образом:

Object1.Nothing(Object1.A);

Наследование

Pascal не поддерживает множественного наследования, то есть каждый класс может иметь не более одного наследника. Для того, чтобы объявить класс наследником какого-то другого класса достаточно указать имя класса-предка при объявлении наследника:

Type Class2 = Object(Class1)

M: Integer;
End;

Var Object3: Class2;

При таком объявлении объект Object3 обладает тремя полями - A, V, M - и одним методом - Nothing(Var Byte).

Методы

Методы объектов обладают единственным отличием от обычных процедур/функций: они, собственно, принадлежат объектам. Следовательно, они обладают доступом к полям именно "своему" объекту. Так как объектов в программе может быть множество, то, во избежание дублирования кода, каждый метод получает в качестве неявного параметра указатель на объект, для которого он вызван. Данный указатель доступен в теле метода как @Self. Естественно, что объявленный (декларированный) при определении класса метод должен быть определен (дефинирован) в программе. Известно, что все методы класса делятся на обычные (статические) и виртуальные. Любой метод считается статическим, если не указано обратное. Указать же, что метод является виртуальным можно, указав после его декларации в дефиниции класса ключевое слово Virtual:

Type
Class3 = Object

Procedure Nothing(Var K: Byte); Virtual;
End;

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

Конструкторы и деструкторы

Среди всех методов класса выделяют две особых группы, имеющих особое значение при создании и удалении объектов этого класса:

кконструкторы;

ддеструкторы.

Конструкторы предназначены для инициализации полей объектов в момент их создания. Объявляются они следующим образом:

Type Class4 = Object

B: Byte;
Constructor Init(CB: Byte);
Destructor Done; Virtual;
End;

Constructor Class3.Init(CB: Byte);
Begin B:= VB;

End;
Destructor Class3.Done;
Begin
End;

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

Несмотря на то, что как конструктор, так и деструктор могут быть вызваны непосредственно, их специфическое назначение привело к появлению возможности вызова их параллельно с созданием/удалением объектов. Так как создание/удаление объектов в процессе выполнения программы на Pascal'е возможны только при использовании ДРП, то функции создания/удаления типизированных переменных имеют дополнительный синтаксис

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24