Могут ли экземпляры или объекты любого класса рассматриваться как атрибуты в другом классе?
Читая книгу Крейга Лармана (Применение UML и паттернов;...), я заметил, что он добавил экземпляры класса Die в качестве атрибутов в класс 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" может "быть жизнеспособным решением... в зависимости от того, что вам нужно делать, конечно.
Вот лучшее объяснение этого в том же вопросе, что и у вас... но, вероятно, лучше объяснено, чем то, что я сделал здесь;)
Это не только возможно, это стандартный случай. Фактически, во многих языках программирования нет большой разницы между классами и элементарными типами данных, такими как int
,
Да, это возможно. ООП обеспечивает отношение контейнера, что означает отношение, в котором один класс может содержать экземпляры другого класса.
Например, может быть класс стула и класс стола и класс комнаты. Теперь в комнате могут быть стулья и столы, поэтому в классе комнаты будут экземпляры стульев и столов.