Состав объекта

редактировать
Метод в компьютерном программировании формирования типов объектов более высокого уровня

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

Композиция объекта относится к логической или концептуальной структуре информации, а не к реализации или физической структуре данных, используемой для ее представления. Например, последовательность отличается от set, потому что (среди прочего) порядок составных элементов имеет значение для первого, но не для второго. Структуры данных, такие как массивы, связанные списки, хэш-таблицы и многие другие, могут использоваться для реализации любого из них. Возможно, сбивает с толку то, что одни и те же термины используются как для структур данных, так и для композитов. Например, «двоичное дерево » может относиться к любому: как структура данных это средство доступа к линейной последовательности элементов, и фактические позиции элементов в дереве не имеют значения (дерево может быть внутренне переставил как угодно, не меняя смысла). Однако, как объектная композиция, позиции релевантны, и их изменение изменит значение (как, например, в кладограммах ).

Содержание

  • 1 Техника программирования
  • 2 Техника моделирования UML
  • 3 Специальные формы
    • 3.1 Сдерживание
    • 3.2 Рекурсивная композиция
    • 3.3 Составной паттерн
  • 4 Составные типы в C
  • 5 Временная шкала композиции на различных языках
  • 6 Агрегация
    • 6.1 Агрегация в COM
  • 7 См. Также
  • 8 Ссылки
  • 9 Внешние ссылки

Техника программирования

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

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

В на основе класса и с типом языков программирования типы можно разделить на составные и несоставные типы, а состав можно рассматривать как отношение между типами: объект составного типа (например, автомобиль) «имеет » объекты других типы (например, колесо). Когда составной объект содержит несколько подобъектов одного и того же типа, им могут быть назначены определенные роли, часто различаемые по именам или номерам. Например, объект Point может содержать 3 числа, каждое из которых представляет расстояние по другой оси, например «x», «y» и «z». Изучение отношений «часть-целое» в целом - это мереология.

Композиция должна отличаться от подтипа, который представляет собой процесс добавления деталей к общему типу данных для создания более конкретного типа данных.. Например, автомобили могут быть конкретным типом транспортного средства: car - это транспортное средство. Подтипирование не описывает отношения между разными объектами, но вместо этого говорит, что объекты одного типа одновременно являются объектами другого типа. Изучение таких отношений - это онтология.

. В языках программирования, основанных на прототипах, таких как JavaScript, объекты могут динамически наследовать поведение от объекта-прототипа в момент их создание. Композицию следует отличать от прототипирования: вновь созданный объект наследует композицию своего прототипа, но сам может быть составлен сам по себе.

Составные объекты могут быть представлены в хранилище путем совместного размещения составных объектов, совместного размещения ссылок или многих других способов. Элементы в составном объекте могут называться атрибутами, полями, элементами, свойствами или другими именами, а результирующая композиция - составным типом, записью хранения <149.>, структура, кортеж или определяемый пользователем тип (UDT). Подробнее см. Раздел агрегирование ниже.

Техника моделирования UML

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

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

  • Свойство представляет атрибут класса.
  • Ассоциация представляет семантическую связь между экземплярами связанных классов. Конец-член ассоциации соответствует свойству связанного класса.
  • Агрегация - это вид ассоциации, моделирующей отношение части / целого между агрегатом (целым) и группой связанных компонентов (частей
  • Композиция, также называемая составной агрегацией, представляет собой разновидность агрегации, которая моделирует отношение части / целого между составной частью (целым) и группой частей, находящихся в исключительной собственности.

Взаимосвязь между агрегат и его компоненты являются слабыми отношениями типа «имеет-а»: компоненты могут быть частью нескольких агрегатов, могут быть доступны через другие объекты без прохождения агрегата и могут пережить агрегированный объект. Состояние объекта-компонента по-прежнему составляет часть совокупного объекта.

Отношения между составным элементом и его частями являются сильными отношениями типа «есть-а»: составной объект несет исключительную «ответственность за существование и хранение. составных объектов », составной объект может быть частью не более одного составного объекта, и« Если составной объект удален, все его экземпляры частей, которые являются объектами, удаляются вместе с ним ». Таким образом, в UML композиция имеет более узкое значение, чем обычная композиция объектов.

Связь между несколькими велосипедами, каждый из которых имеет одного владельца; Состав велосипеда с частями рамы, из которых состоит велосипед; и агрегат велосипеда с его колесами, которые существуют без велосипеда Нотация UML для ассоциации, композиции и агрегирования

Графическая нотация представляет:

  • свойство как типизированный элемент в поле включающего класса,
  • ассоциацию в виде простой линии между связанные классы,
  • агрегат в виде незаполненного ромба на стороне агрегата и сплошной линии,
  • композиция как залитый алмаз на стороне композита и твердое тело строка.

.

Особые формы

Ограничение

Состав, который используется для хранения нескольких экземпляров составного типа данных, называется включением. Примерами таких контейнеров являются массивы, ассоциативные массивы, двоичные деревья и связанные списки.

В UML, включение отображается с кратностью 0.. * или 1.. *, что указывает на то, что составной объект состоит из неизвестного числа экземпляров составного класса.

Рекурсивная композиция

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

В UML рекурсивная композиция изображается как ассоциация, агрегация или композиция класса с самим собой.

Составной шаблон

Составной шаблон проектирования - это объектно-ориентированный дизайн, основанный на составных типах, который сочетает в себе рекурсивную композицию и сдерживание для реализации сложных иерархий по частям и целым.

Составные типы в C

Это пример композиции в C.

struct Person {int age; имя символа [20]; enum {job_seeking, professional, non_professional, retired, student} трудоустройство; };

В этом примере примитивные (несоставные) типы int, enum {job_seeking, professional, non_professional, retired, student}и тип составного массива charобъединяются в составную структуру Person. Каждая структура Person"имеет" возраст, имя и тип занятости.

Временная шкала композиции на разных языках

C вызывает запись как struct или структуру; объектно-ориентированные языки, такие как Java, Smalltalk и C ++, часто скрывают свои записи внутри объектов ( класс экземпляров); языки семейства ML просто называют их записями. COBOL был первым широко распространенным языком программирования, поддерживающим записи напрямую; ALGOL 68 получил его от COBOL, а Pascal получил его более или менее косвенно, из АЛГОЛА 68. Common Lisp предоставляет структуры и классы (последние через Common Lisp Object System ).

1959 - COBOL
01 customer-record. 03 customer-number pic 9 (8) комп. 03 имя клиента. 05 имя-имя рис x (15). 05 начальное-2 рис x. 05 фамилия рис x (15). 03 адрес покупателя. Улица 05 улица 07 название улицы рис x ( 15). 09 номер дома рис.999 комп. 05 город рис. X (10). 05 код страны рис. X (3). 05 почтовый индекс рис. X (8). 03 причитающаяся сумма рис. 9 (8) комп.
1960 - ALGOL 60

Массивы были единственным составным типом данных в Algol 60.

1964 - PL / I
dcl 1 на основе newtypet (P); 2 (a, b, c) фиксированный интервал (31), 2 (i, j, k) float, 2 r ptr; allocate newtypet;
1968 - АЛГОЛ 68
int max = 99; mode newtypet = [0..9] [0..max ] struct (long real a, b, c, short int i, j, k, ref real r); newtypet newarray t = (1, 2, 3, 4, 5, 6, heap real: = 7)

Например, связанный список может быть объявлен как:

mode node = union (real, int, comp, строка), list = struct (узел val, ref list next);

Для АЛГОЛА 68 только имя типа появляется слева от равенства, и, что особенно важно, конструкция выполняется - и может быть прочитана - слева направо без учета приоритетов.

1970 - Паскаль
тип a = массив [1..10] целых чисел; b = запись a, b, c: реальные; i, j, k: целое число; конец;
1972 - KR C
#define max 99 struct newtypet {double a, b, c; float r; короткие i, j, k; } newarrayt [10] [макс + 1];
1977 - FORTRAN 77

Фортран 77 имеет массивы, но не имеет формальных определений записей / структур. Обычно составные структуры создавались с использованием операторов EQUIVALENCEили COMMON:

CHARACTER NAME * 32, ADDR * 32, PHONE * 16 REAL OWING COMMON / CUST / NAME, ADDR, PHONE, OWING
1983 - тип Ada
Cust - это запись Name: Name_Type; Адрес: Addr_Type; Телефон: Phone_Type; Owing: Целочисленный диапазон 1..999999; конец записи;

В Ada 95 концепции ООП реализованы через тегированные типы (эквивалент класса C ++), в Ada 2012 добавлена ​​поддержка проверки подстановки посредством общеклассовых контрактов.

1983 - C ++
const int max = 99; class {public: double a, b, c; поплавок r; короткие i, j, k; } newtypet [10] [макс + 1];
1991 - Python
max = 99 class NewTypeT: def __init __ (self): self.a = self.b = self.c = 0 self.i = self.j = self.k = 0.0 # Инициализировать пример массива этого класса. newarrayt = [[NewTypeT () для i в диапазоне (max + 1)] для j в диапазоне (10)]
1992 - FORTRAN 90

Массивы и строки были унаследованы от FORTRAN 77, а новое зарезервированное слово было введено: тип

тип newtypet двойной точности a, b, c целое число * 2 i, j, k * Тип указателя отсутствует REF REAL R тип конца типа (newtypet) t (10, 100)

FORTRAN 90 обновлена ​​и включена концепция FORTRAN IV под названием NAMELIST.

INTEGER :: jan = 1, feb = 2, mar = 3, apr = 4 NAMELIST / week / jan, feb, mar, apr
1994 - ANSI Common Lisp

Common Lisp предоставляет структуры а стандарт ANSI Common Lisp добавил классы CLOS.

(defclass some-class () ((f: type float) (i: type integer) (a: type (array integer (10)))))

Для получения дополнительных сведений о композиции в C / C ++, см. Составной тип.

Агрегация

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

Композиция обычно реализуется таким образом, что объект содержит другой объект. Например, в C ++ :

class Professor; // Определен в другом месте class Department {public: Department (const std :: string title): title_ (title) {} private: // Агрегация: | Профессора | может пережить | Департамент |. std :: vector >members_; const std :: string title_; }; class University {public: University () = default; private: // Состав: | Отделения | существуют только до тех пор, пока существует факультет. std :: vector faculty_ = {Кафедра («химия»), Кафедра («физика»), Кафедра («искусства»),}; };

В совокупности объект может содержать только ссылку или указатель на объект (и не нести ответственность за него сроком действия ).

Иногда агрегацию называют составом, когда различие между обычным составом и агрегацией не имеет значения.

Приведенный выше код преобразуется в следующую диаграмму классов UML:

Aggregation-Composition3.png

Агрегация в COM

Агрегация в COM

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

См. Также

Ссылки

Внешние ссылки

Последняя правка сделана 2021-06-01 07:22:40
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте