Procedure Draw; virtual; abstract; 



Компоновщик (англ. Composite pattern) — шаблон проектирования, относится к структурным паттернам, объединяет объекты в древовидную структуру для представления иерархии от частного к целому. Компоновщик позволяет клиентам обращаться к отдельным объектам и к группам объектов одинаково.

Структурные паттерны

В структурных паттернах рассматривается вопрос о том, как из классов и объектов образуются более крупные структуры. Структурные паттерны уровня класса используют наследование для составления композиций из интерфейсов и реализаций.

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

Цель

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

ПРОГРАММА!!!

Uses Contnrs.

 Модуль Contnrs.

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

Прежде всего, стоит заметить, что все классы в этом модуле являются либо наследниками, либо инкапсуляторами ( класс A является его public или private свойством или полем ) класса TList. Использование этого класса привело к тому, что все списки (а ведь бывают еще стеки и очереди) унаследовали свойства и методы TList, но с новым содержанием.

TList

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

 

Теперь подробнее о классах.

TClassList

Этот класс предназначен для хранения списка классов, доступ к ним осуществляется посредством свойства Items (объявленного по умолчанию).

TComponentList

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

TObjectList

Класс-контейнер для хранения объектов. Контейнер может владеть правами на удаления носимых объектов при установленном свойстве OwnsObjects.

TObjectQueue

Очередь объектов.

TObjectStack

Стек объектов.

TOrderedList

Упорядоченный список. Является предком стеков и очередей. Основная особенность - возможность читать или записывать элементы только с начала или с конца.

TQueue

Очередь. Содержит очередь указателей.

TStack

Стек. Содержит стек указателей.

 

Override/Vitual/Dynamic - методы

Если метод в классе предка объявлен как виртуальный (virtual) или динамический (dynamic), вам необходимо перекрыть его во всех классах-наследниках. Если вы объявляете наследованный метод виртуальным или динамическим, вы начинаете строить его новое виртуальное/динамическое дерево наследования. Допустим, у нас есть следующая иерархия: A (родитель) - B - C - D. Если вы объявляете метод как виртуальный (или динамический) в A, перекрываете в B, создаете виртуальным в C и перекрываете в D, вот что получается: фактический класс, используемый класс, использующийкласс для доступа к методу метод-----------+---------------------+-------------------- D D D D C D D B B D A B C C C C B B C A B  B B B B A B Вывод: работа виртуального/динамического наследования прекращается в момент создания одноименного виртуального/динамического метода наследниками класса.

 

A:=TNum.Create; Конструирование объекта. Объект размещается в памяти, адрес заносится в указатель.

 

procedure Draw; virtual; abstract; 

 

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

 


Дата добавления: 2018-02-18; просмотров: 204; ЗАКАЗАТЬ РАБОТУ