Листинг 5.17. Использование оператора is
unit CheckClass; Uses PolymorphObjects; Interface Procedure DrawFigure(Figure: TGeomFigure) ; {Заголовок процедуры} Implementation ProcedureDrawFigure(Figure : TGeomFigure) ; {Описание процедуры} Begin If Figure is TLine{Проверка соответствия объекта, на который указывает переменная Figure, классу TLine} Then Figure.Draw{Если тип объекта — TLine, то вызывается метод Draw} Else Expend; {В противном случае — выход из процедуры} End. Оператор as В рассмотренном примере (листинг 5.17) допускается вызов метода Draw из объекта, на который указывает параметр Figure, переданный в процедуру, так как заявленный тип параметра позволяет это сделать — в классе TGeomFigure описан метод Draw. Однако иногда требуется вызвать метод, который реализован не в заявленном классе, а в его наследнике, реальный экземпляр которого и передается в качестве параметра. Попытка сделать это вызовет ошибку компиляции. Для указания компилятору о том, что объект следует рассматривать как экземпляр какого-либо конкретного класса, предусмотрен оператор as, используемый следующим образом: <Ссылка на объект> as<Название класса> В результате такого указания Delphi пытается обращаться к объекту, на который указывает ссылка, как к экземпляру заданного класса. Так. если бы в описании класса TGeomFigure не было метода Draw, а описание его располагалось бы в классе TLine, то метод можно было бы вызвать следующим образом: If Figure is TLine {Проверка соответствия объекта, на который указывает переменная Figure, классу TLine} Then (Figure as TLine) .Draw {Если тип объекта — 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 полностью реализована логика изменения цвета этой фигуры. Такой подход позволяет локализовать отдельные фрагменты логики сложных классов уже на стадии проектирования вершины иерархии, существенно упрощая тем самым разработку программного продукта в целом.
Популярное: Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (367)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |