Я довольно новичок в UML, поэтому у меня есть некоторые вопросы об обобщении и реализации. Я моделирую поведение электронного микроконтроллера, и мне нужно сгенерировать код на C++ из описания UML.Обобщение и реализация UML
Насколько мне известно, классареализует интерфейса, что означает, что он может обеспечить реализацию интерфейса. A обобщение отношения могут существовать между двумя классами. В этом случае производный класс наследует всех членов базового класса и получает доступ к открытым и защищенным членам.
Вот мой вопрос (я использую Visual Paradigm в качестве инструмента моделирования). Предположим, что у нас есть модуль микроконтроллера, а именно Timer
. У нас есть набор операций, которые мы можем выполнить, например initTimer()
, startTimer()
, stopTimer()
и так далее. Фактически эти функции определяют своего рода API. У нас могут быть разные классы Timer
, скажем TimerA
, TimerB
, TimerC
, которые наследуют (или реализуют?) Все указанные операции. Возможно, картина сделает сценарий более ясным. [C] означает классификатор.
+----------------------------------+
| <<SW>> |
| <<Singleton>> |
+--------------| TimerA |
| +----------------------------------+
| | -instance : TimerA* = null [C] |
| | -instanceFlag : bool = false [C] |
| | -moduleAddress const = 0x0010 |
| +----------------------------------+
| | -TimerA() |
V | +getInstance() : TimerA* [C] |
+---------------+ +----------------------------------+
| <<SW>> |
| Timer |
+---------------+
| +initTimer() |
| +startTimer() |<-----------------------+
| +stopTimer() | |
+---------------+ +----------------------------------+
| <<SW>> |
| <<Singleton>> |
| TimerB |
+----------------------------------+
| -instance : TimerB* = null [C] |
| -instanceFlag : bool = false [C] |
| -moduleAddress const = 0x0020 |
+----------------------------------+
| -TimerB() |
| +getInstance() : TimerB* [C] |
+----------------------------------+
Visual Paradigm позволяет пользователю вводить код в каждую функцию. Я спрашиваю вас, какие отношения должны быть стрелками.
1) Обобщение: Timer
класс с набором операций. Каждая операция имеет свою реализацию кода. Два производных класса TimerA
и TimerB
с обобщающей ссылкой, наследующей операции класса Timer
.
2) Реализация: Timer
является интерфейсом (не класс, как показано) и два класса, реализующих TimerA
и TimerB
. Критическая точка следующая. Хотя Timer является интерфейсом, и его операции не должны содержать детали реализации, VP позволяет написать код реализации для трех операций. При генерации кода, интерфейс C++, класс Timer
создан: initTimer()
, startTimer()
и stopTimer()
являются виртуальные члены из Timer
с нет кода (как это должно быть). Создается класс C++ TimerA
, который наследует класс Timer
; кроме того, три операции Timer
копируются среди членов TimerA
с реализацией кода, которую я написал для операций класса интерфейса. Это происходит и для TimerB
.
На ваш взгляд, какое из двух описаний лучше? Правильно ли писать реализацию кода для операций интерфейса, даже если я знаю, что после генерации кода будут переданы в сторону реализующих классов?
Пожалуйста, исправьте меня, если я ошибаюсь. Благодаря вашему моделированию обеспечивается единственное существование классов 'TimerA' и' TimerB', потому что соответствующий флаг задается любой из двух оболочек singleton. То, что на самом деле создается, является объектом класса 'Timer' для всех доступных оболочек Singleton (это делается с помощью' TimerA :: getInstance() 'и' TimerB :: getInstance() 'static members). Итак, в конце концов, конструкторы 'TimerA()' и 'TimerB()' не используются? Могу передать аргументы классу Timer из TimerA и TimerB. Я ссылаюсь, в частности, на 'moduleAddress'. Благодарю. –
@ UmbertoD. да, вот что я имел в виду: 'TimerA()' и 'TimerB()' могут иметь классные «статические» конструкторы, которые инициализируют переменные 'instance'.Но ** не беру его буквально **, поскольку он будет содержать для 'C#', где тик таймера будет обрабатываться функцией, прикрепленной к четному обработчику таймера (https://msdn.microsoft.com/en-us/ библиотека/system.timers.timer.elapsed (v = vs.110) .aspx). Я не был в мире «C++» активно в течение нескольких лет (и я рад). В 'C++' вы можете реализовать его, создав подклассы. Поэтому мой ответ может быть довольно обманчивым, когда дело доходит до генерации кода – xmojmr