是否有可能有一个基类方法调用所有派生类的相同(但重写方法)?

时间:2012-02-28 15:32:05

标签: c++ oop design-patterns inheritance

用文字解释有点难,所以我举个例子:

(以下代码可能包含不正确的语法,但只需提供一个想法)

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),以及调用从A派生的其他类的每个static void Update(UINT someValue)方法

这可能以这种或那种方式出现吗? 如果是的话,你会怎么做?

3 个答案:

答案 0 :(得分:2)

我认为你应该使用复合模式。您可以在http://en.wikipedia.org/wiki/Composite_patternhttp://www.javacamp.org/designPattern/composite.html

上阅读相关信息

答案 1 :(得分:1)

我的评论下面的信息不足以清楚地了解你的代码,但我在想是否有可能做类似C#对事件做的事情,你可以在那里注册事件和触发的类(在这种情况下你的基类)可以实现一个函数指针列表(指向派生方法,在这种情况下你必须有派生类的实例)并调用所有然后迭代这个列表。只是一个想法,不知道这是否是你需要的。

答案 2 :(得分:1)

没有办法自动完成。获得效果的一种简单方法是每个派生类调用其基类的函数:

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是好的 - 它不关心更新,但它的基类的功能仍然可以被调用。因此,对于实施者来说,这不是一个巨大的负担,他们只需遵循 if 他们实现该功能的规则,他们必须调用基础。

另一种方法可能是基类保留对更新感兴趣的“侦听器”列表,并在发生更新时依次调用它们。然后,每个派生类都可以注册一个合适的监听器。

但是,如果每个级别都进行了更改但是可能会抛出一个或多个级别,则可能很难使此类异常安全的代码。