Enterprise Architect - наследовать методы от интерфейса в диаграмме классов - PullRequest
3 голосов
/ 12 марта 2012

В Enterprise Architect (версия 9.2.921) я хочу сделать диаграмму классов. У меня есть класс MyInterface, который действует как интерфейс. Поэтому в EA я выбираю стереотип <<interface>>, а также помечаю его как abstract.

Теперь, для простоты, мой абстрактный интерфейс определяет одну виртуальную функцию. Теперь у меня есть класс MyChild, который является дочерним элементом моего интерфейса (class MyChild :: MyInterface) и который должен реализовывать эту функцию.

Для этого в EA я создал новый класс. Затем щелкните правой кнопкой мыши на нем -> Дополнительно -> Родитель. В качестве типа я выбираю implements, а затем выбираю класс интерфейса.

На моей диаграмме классов стрелка от дочернего элемента к родительскому верна (пунктирная линия с пустым наконечником стрелки в направлении интерфейса).

Теперь проблема в том, что я ожидаю, что EA добавит мою абстрактную функцию из интерфейса прямо в сам класс реализации. Так, например, если я изменяю / добавляю / удаляю виртуальную функцию в классе Interface, она сразу же изменяется в дочерних классах. Но проблема в том, что функция не отображается в теле дочернего класса.

Есть ли способ заставить Enterprise Architecht сделать это?

Ответы [ 3 ]

4 голосов
/ 13 марта 2012

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

Когда дело доходит до диалогового окна «Переопределения и реализации», возникают некоторые тонкости.

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

Если вы используете класс в диаграмме последовательности и вызовете его, вы увидите, что вы можете выбрать интерфейсную операцию в диалоговом окне «Свойства сообщения» (при условии, что выбран «Показать унаследованные методы»). Это имя будет обновлено автоматически, если вы переименуете операцию в интерфейсе.

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

Если вы выбираете операцию в диалоговом окне «Переопределения и реализации», это означает, что вы делаете ее копию. EA не будет помнить, откуда произошла переопределенная операция, и не будет обновлять имя, если вы измените его в интерфейсе / абстрактном классе.

Использование правого клика - Дополнительно - Родительский метод обходит диалоговое окно «Переопределения и реализации», но создает соединитель, как вы заметили.

Теперь вы упоминаете, что создаете класс, а затем задаете стереотип "интерфейс". Это не способ сделать это; вместо этого вы должны создать интерфейс, используя символ интерфейса на панели инструментов. Класс со стереотипом "interface" - это не то же самое, что Interface, и я не уверен, какое из описанных мной поведений вы получите с этой конструкцией.

Если вам нужен интерфейс, используйте его. Если, с другой стороны, вы говорите об абстрактном классе, то Class прав, и ни у абстрактного, ни у конкретного класса не должно быть стереотипа "interface".

Также обратите внимание, что если у вас есть кодовая база, для которой вы хотите рисовать диаграммы, есть вероятность, что EA может ее перепроектировать для вас (если она на C ++, C #, Java или примерно на дюжине других языков).

2 голосов
/ 13 марта 2012

Хорошо, я нашел способ:

  1. Удалить связь между двумя классами (если она уже была)
  2. Выберите Realization из Class Relationships на панели инструментов
  3. Нарисуйте линию от вашего дочернего класса до интерфейса
  4. При отпускании мыши вам будет предложено выбрать функцию, которую должен выполнять ваш ребенок

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

0 голосов
/ 11 сентября 2013

У меня была такая же проблема.

Я не очень доволен ответом. Как «удалить» реализацию

  • Если «Удалить» = «Скрыть на диаграмме», в конце у вас будет две реализации-ассоциации
  • Если "Удалить" = "Удалить из модели", этот Асс будет удален в других Диаграммах, где он использовался
...