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

Читая книгу Крейга Лармана (Применение UML и паттернов;...), я заметил, что он добавил экземпляры класса Die в качестве атрибутов в класс DiceGame.


Изображение Частичной Диаграммы Класса DiceGame,


Является ли это возможным? и есть много связанных с этим вопросов программирования, в которых они отрицают это.

5 ответов

Решение

Я бы изменил вопрос на "Могут ли ссылки на любой класс рассматриваться как атрибуты в другом классе?" Технически ответ "да", но вы не должны моделировать его таким образом в UML. Вы должны моделировать простые значения как атрибуты (внутри прямоугольника класса), а не простые ссылки - как ассоциации. Простые значения идентифицируются только по их значениям (например, число 5), тогда как непростые ссылки указывают на вещи с идентичностью. В вашем случае каждый Die должен иметь идентичность, отличную от его текущей номинальной стоимости. Следовательно, вы не должны моделировать атрибуты типа Die, вы должны смоделировать свойство в конце ассоциации.

На размещенной вами диаграмме есть три (!!) свойства типа Die, Один называется die1один называется die2и другой является неназванным с множественностью 2, На языке программирования это даст вам четыре места для хранения ссылок на ваши кости, что, очевидно, неверно.

Я бы смоделировал это следующим образом:

Когда вы генерируете код (или транскрибируете вручную), dice свойство становится переменной-членом внутри DiceGame, Эта переменная-член обычно набирается коллекцией на вашем языке программирования, но ее также можно смоделировать как массив. Эта коллекция или массив позволяет вам получить доступ к обоим кубикам.

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

Это не случаи Die но просто два свойства типа Die, Картина не очень хорошо использует UML (позор Ларману). Ассоциация между DiceGame а также Die использовать 2 кратности. И скорее всего он имеет в виду die1 а также die2 с этим. Но это было бы угадать. Лучшая запись будет

с соответствующими именами конца ассоциации.

Краткий ответ: да... и это происходит очень часто.

В ОО есть хитрый маленький трюк, чтобы выяснить, должен ли класс содержать свойство некоторого другого типа класса: "Is-A" и "Has-A".

В этом случае у вас есть класс DiceGame. Вы спрашиваете себя: "Is-A" - игра "DiceGame a Die" или "DiceGame - игра" Has-A ""? Если ответ - первый, то вы используете наследование, в противном случае оно устанавливается как свойство (свойства), как в примере, который вы опубликовали.

Если у вас есть другой класс с именем "GamblingRoom", наличие свойства DiceGame для этого класса "GamblingRoom" может "быть жизнеспособным решением... в зависимости от того, что вам нужно делать, конечно.

Вот лучшее объяснение этого в том же вопросе, что и у вас... но, вероятно, лучше объяснено, чем то, что я сделал здесь;)

HAS-A, IS-A терминология в объектно-ориентированном языке

Это не только возможно, это стандартный случай. Фактически, во многих языках программирования нет большой разницы между классами и элементарными типами данных, такими как int,

Да, это возможно. ООП обеспечивает отношение контейнера, что означает отношение, в котором один класс может содержать экземпляры другого класса.

Например, может быть класс стула и класс стола и класс комнаты. Теперь в комнате могут быть стулья и столы, поэтому в классе комнаты будут экземпляры стульев и столов.

Другие вопросы по тегам