демонстрация

екст и вопрос сначала, скелетный код внизу поста)

Мы создаем и внедряем среду C ++ для использования в таких средах, как Arduino.

Для этого я хочу использовать шаблон Observer, где любой компонент заинтересован в изменении состояния датчиков (Observables) может зарегистрироваться, и он будет уведомлен об этих изменениях Наблюдательнойnotification() Метод Обозревателя с самим собой в качестве параметра.

Один наблюдатель может наблюдать несколько наблюдаемых, и наоборот.

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

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

Мой вопрос:Какое самое элегантное решение для будущего развития или образец для этого?

Редактировать: Обратите внимание, что конструкции dynamic_cast <> невозможны из-за ограничений Arduino

Я создал следующую иерархию классов (скелетный код):

class SenseNode
{
public:
  SenseNode() {};
  SenseNode(uint8_t aNodeId): id(aNodeId) {}
  virtual ~SenseNode() {}

  uint8_t getId() { return id; };
private:
  uint8_t id = 0;
};

class SenseStateNode : virtual public SenseNode
{
public:
  SenseStateNode(uint8_t aNodeId) : SenseNode(aNodeId) {}
  virtual ~SenseStateNode() {}

  /** Return current node state interpreted as an integer. */
  virtual int getValueAsInt();
};

class SenseObservable: public SenseStateNode
{
public:
  SenseObservable(uint8_t aNodeId);
  virtual ~SenseObservable();
  /** Notify all interested observers of the change in state by calling Observer.notification(this) */
  virtual void notifyObservers();
protected:
  virtual void registerObserver(SenseObserver *);
  virtual void unregisterObserver(SenseObserver *);
};

class SenseObserver: virtual public SenseNode
{
public:
  SenseObserver() {};
  virtual ~SenseObserver();

  /** Called by an Observable that we are observing to inform us of a change in state */
  virtual void notification(SenseObservable *observable) {
    int v = observable->getValueAsInt(); // works like a charm
    DateTime d = observable-> ????  // How should i solve this elegantly?
  };
};

Ответы на вопрос(6)

Ваш ответ на вопрос