имеет-а
Эта статья нуждается в дополнительных цитатах для проверки . ( октябрь 2023 г. ) |
В проектировании баз данных , объектно-ориентированном программировании проектировании has и -a ( has_a или has a ) — это отношение композиции , при котором один объект (часто называемый составным объектом или объектом-частью/составляющей/членом) «принадлежит» (является частью или объектом-членом). член ) другого объекта (называемого составным типом) и ведет себя в соответствии с правилами владения. Проще говоря, отношение has-a в объекте называется полем-членом объекта. Множественные отношения «имеет-а» объединятся, образуя притяжательную иерархию.
Связанные понятия
[ редактировать ]«Has-a» следует противопоставлять отношению is-a ( is_a или is a ), которое образует таксономическую иерархию ( подтипирование ).
Решение о том, является ли наиболее логичным отношением для объекта и его подчиненного объекта, не всегда является очевидным: has-a или is-a . Путаница по поводу таких решений привела к необходимости создания этих металингвистических терминов. Хорошим примером отношения has-a являются контейнеры в C++ STL .
Подводя итоги отношений, мы имеем
- гиперним - гипонимные (супертип-подтип) отношения между типами (классами), определяющие таксономическую иерархию, где
- для отношения наследования : гипоним (подтип, подкласс) имеет отношение типа ( is-a ) со своим гипернимом (супертипом, суперклассом);
- холоним - мероним (целое/сущность/контейнер-часть/составляющая/член) отношения между типами (классами), определяющие притяжательную иерархию, где
- для отношения агрегации (т.е. без владения):
- холоним (целое) имеет отношение к своему мерониму (части),
- для отношения композиции (т.е. с правом собственности):
- мероним (составляющая) имеет отношение части со своим холонимом (субъектом),
- для сдерживания [1] связь:
- мероним (член) имеет отношение член-из со своим холонимом ( контейнер );
- для отношения агрегации (т.е. без владения):
- отношения понятие-объект (тип-токен) между типами (классами) и объектами (экземплярами), где
- токен (объект) имеет отношение экземпляра со своим типом (классом).
Примеры
[ редактировать ]Модель сущность-связь
[ редактировать ]
В базах данных отношения «имеет-а» обычно представляются в модели «сущность-отношения» . Как вы можете видеть на диаграмме справа, учетная запись может иметь несколько символов. Это показывает, что аккаунт имеет отношение «есть» к персонажу.
Диаграмма классов UML
[ редактировать ]
Неправильное использование композиции и агрегирования
В объектно-ориентированном программировании эту связь можно представить с помощью диаграммы классов унифицированного языка моделирования . Это отношение также известно как композиция. Как вы можете видеть из диаграммы классов справа, автомобиль «имеет» карбюратор или автомобиль «состоит из» карбюратора. Когда алмаз окрашен в черный цвет, это означает композицию , то есть объект на стороне, ближайшей к алмазу, состоит из другого объекта или содержит его. Белый ромб означает агрегацию , что означает, что объект, ближайший к ромбу, может обладать другим объектом или владеть им.
С++
[ редактировать ]Другой способ отличить композицию от агрегации при моделировании реального мира — учитывать относительное время жизни содержащегося объекта. Например, если объект «Автомобиль» содержит объект «Шасси», скорее всего, шасси не будет заменено в течение срока службы автомобиля. Срок его службы будет такой же, как и у самого автомобиля; таким образом, отношения являются составными . С другой стороны, если объект «Автомобиль» содержит набор объектов «Шины», эти объекты «Шины» могут изнашиваться и заменяться несколько раз. Или, если Автомобиль станет непригодным для использования, некоторые Шины могут быть утилизированы и переданы другому Автомобилю. В любом случае время жизни объектов Tire отличается от времени жизни объекта Car; поэтому отношения являются отношениями агрегации .
Если бы нужно было создать программный класс C++ для реализации описанных выше отношений, объект Car содержал бы полный объект Chassis в элементе данных. Этот объект Chassis будет создан в конструкторе класса Car (или определен как тип данных элемента данных и его свойства, назначенные в конструкторе). И поскольку это будет полностью содержащийся элемент данных класса Car, Chassis объект больше не существовал бы, если бы объект класса Car был удален.
С другой стороны, члены данных класса Car, указывающие на объекты Tire, скорее всего, будут указателями C++. Объекты Tire можно создавать и удалять извне или даже присваивать элементам данных другого объекта Car. Объекты «Шины» будут иметь независимое время жизни, отдельное от момента удаления объекта «Автомобиль».
См. также
[ редактировать ]- Состав объекта
- Имеет-а
- Это-а
- Гиперонимия (и супертип )
- Гипонимия (и подтип )
Примечания
[ редактировать ]- ^ См. также «Сдерживание» (компьютерное программирование) .