用文字解释有点难,所以我举个例子:
(以下代码可能包含不正确的语法,但只需提供一个想法)
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)
方法
这可能以这种或那种方式出现吗? 如果是的话,你会怎么做?
答案 0 :(得分:2)
我认为你应该使用复合模式。您可以在http://en.wikipedia.org/wiki/Composite_pattern和http://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 他们实现该功能的规则,他们必须调用基础。
另一种方法可能是基类保留对更新感兴趣的“侦听器”列表,并在发生更新时依次调用它们。然后,每个派生类都可以注册一个合适的监听器。
但是,如果每个级别都进行了更改但是可能会抛出一个或多个级别,则可能很难使此类异常安全的代码。