Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Then ( Figure as TLine ) . Draw↑ ⇐ ПредыдущаяСтр 8 из 8 Содержание книги
Поиск на нашем сайте
{Если тип объекта — TLine, то вызывается метод Draw} Else Exit; {В противном случае — выход из процедуры} Заметим, что приведение типов может использоваться, в основном, при работе с объектами, изменение иерархии которых невозможно. К таким объектам, например, относятся стандартные объекты Delphi. В остальных случаях наличие подобных конструкций в программе, скорее всего, указывает на неправильно спроектированную иерархию классов. 5.4.3. Абстрактные методы Использование наследования и связанного с ним свойства полиморфизма очень удобно при проектировании сложных систем, состоящих из групп классов, имеющих смысловое единство. Такие классы обычно имеют одного родителя, в котором прописываются заголовки методов, необходимых для поддержки функциональности ветви иерархии. В рассматриваемых нами примерах таким классом был TGeomFigure, в котором метод Draw описывался, но не выполнял каких-либо конкретных действий. Для того, чтобы не описывать «пустых» методов, увеличивая бесполезный размер исходного текста программ, в Delphi предусмотрен специальный модификатор методов abstract (англ. Abstract — абстрактный, фиктивный): Procedure <Класс>.<Метод>(<Список параметров>); virtual; abstract; Или для методов-функций: Function <Класс>.<Метод>(<Список параметров>): <Тип значе-ния>; virtual; abstract; Описание метода, помеченного ключевым словом abstract, в классе, где он описан, не требуется, однако и вызвать его из экземпляра данного класса невозможно. При попытке произвести такой вызов возникнет ошибка времени выполнения программы"Project Projectl.exe raised exception class EAbstractError with message 'Abstract Error'."— "Исключительная ситуация EAbstractError в проекте Projectl.exe". Абстрактный метод всегда является виртуальным (помечен ключевым словом virtual) или динамическим (помечен ключевым словом dynamic) и может быть переопределен в одном из классов-потомков. Соответственно, из экземпляров классов, переопределивших абстрактный метод, его вызов возможен. Абстрактные методы называют иногда чисто виртуальными, пример их использования приведен в листинге 5.18. Листинг 5.18. Использование абстрактных методов; unit AbstractMethods; Interface Type TGeomFigure = class {Описание класса TgeomFigure с виртуальным абстрактным методом Draw} Procedure Draw; virtual; abstract; End; {Заголовок абстрактного метода. Описательная часть класса не содержит реализации данного метода} TLine = class Procedure Draw; override; End; {Описание класса Tline с переопределенным методом Draw} Implementation Procedure TLine.Draw; Begin {Вывод линии} end; {Описание метода Draw класса TLine, -который в классе-родителе описан как абстрактный} Procedure OsingPolymorph; Var GeomFigure: TGeomFigure; {Переменная — ссылка на экземпляр класса TGeomFigure} Begin GeomFigure:= TLine.Create; GeomFigure. Draw; {В момент выполнения такого вызова переменная GeomFigure должна указывать не на экземпляр класса TGeomFigure, а на экземпляр класса-наследника, переопределившего абстрактный метод Draw. В данном случае, это экземпляр класса TLine} GeomFigure. Free; End; End.
5.4.4. Полиморфизм и property-свойства Рассмотрим пример, приведенный в листинге 5.19. Отметим использование свойства полиморфности объектов в рассмотренном примере. При установке значения property-свойству Color автоматически вызывается метод SetColor, которому в качестве параметра передается новое значение цвета. Данное значение заносится в protected-свойство f Color, а затем производится автоматический вызов метода Draw. Метод Draw является виртуальным и может быть переопределен в классах-наследниках. При установке какого-либо значения property-свойству Color класса-наследника будет вызвана та версия метода Draw, которая описана именно в нем, а не в классе TGeomFigure. Таким образом, при отсутствии информации о виде фигур, выводимых классами-наследниками, в классе TGeomFigure полностью реализована логика изменения цвета этой фигуры. Такой подход позволяет локализовать отдельные фрагменты логики сложных классов уже на стадии проектирования вершины иерархии, существенно упрощая тем самым разработку программного продукта в целом. Листинг 5.19. Полиморфизм и property -свойства unit Geom 5; Interface Type TGeomFigure = class Protected fColor: Integer; {Описание свойства с областью видимости protected} Procedure Draw; virtual, {Метод прорисовки геометрической фигуры (виртуальный, предназначен для переопределения в классах-наследниках)} Procedure SetColor(aColor: Integer); {Процедура установки protected- -свойства fColor} Public Property Color: Integer read fColor write SetColor; {Описание property-свойства Color} End; Implementation
|
||||
Последнее изменение этой страницы: 2021-04-04; просмотров: 51; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.72.24 (0.006 с.) |