Возможно ли иметь метод базового класса, который вызывает один и тот же (но переопределенный метод) всех его производных классов? - PullRequest
0 голосов
/ 28 февраля 2012

Это немного сложно объяснить словами, поэтому я приведу пример:

(следующий код может иметь неправильный синтаксис, но этого достаточно, чтобы дать представление)

class A
{
public:
   static void Update(UINT someValue);
};

class B : public A
{
public:
   static void Update(UINT someValue);
};

class C : public A
{
public:
   static void Update(UINT someValue);
};

Я знаю, что статические функции-члены не переопределяют друг друга, но давайте предположим, что они делают.Чего я хочу добиться, так это когда A::Update(someValue); вызывается, он должен неявно вызывать B :: Update (someValue), а также C :: Update (someValue), а также вызывать каждый static void Update(UINT someValue) метод других классов, полученных изA

Возможно ли это так или иначе?И если это так, как бы вы это сделали?

Ответы [ 3 ]

2 голосов
/ 28 февраля 2012

Я думаю, вы должны использовать вместо этого составной шаблон. Вы можете прочитать об этом в http://en.wikipedia.org/wiki/Composite_pattern и http://www.javacamp.org/designPattern/composite.html

1 голос
/ 28 февраля 2012

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

class A
{
  public:
    static void Update(UINT someValue) {
        std::cout << "A\n";
    }
};

class B : public A
{
  public:
    static void Update(UINT someValue) {
        A::Update(someValue);
        std::cout << "B\n";
    }
};

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

Другой способ может быть для базового класса.вести список «слушателей», которые заинтересованы в обновлениях, и вызывать их по очереди, когда происходит обновление.Каждый производный класс может затем зарегистрировать подходящего прослушивателя.

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

1 голос
/ 28 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...