是否有可能有一个基类方法调用其所有派生类的相同(但被覆盖的方法)?
Posted
技术标签:
【中文标题】是否有可能有一个基类方法调用其所有派生类的相同(但被覆盖的方法)?【英文标题】:Is it possible to have a base class method that calls the same (but overridden method) of all it's derived classes? 【发布时间】:2012-02-28 15:32:04 【问题描述】:语言有点难解释,我举个例子吧:
(以下代码可能语法不正确,但足以给出一个想法)
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)
方法
这可能以某种方式实现吗? 如果是,你会怎么做?
【问题讨论】:
这是不可能的,而且会违背 OOP 的目的。父类不知道它的子类。 这些类将如何被实例化? @Andres 好吧,就我的代码而言:Specific_Material spM; Material* pM = &spM;
【参考方案1】:
我认为您应该改用复合模式。您可以在http://en.wikipedia.org/wiki/Composite_pattern 和http://www.javacamp.org/designPattern/composite.html 阅读有关它的信息
【讨论】:
这是一种非常狂野的设计模式哈哈,适合我的需要:)【参考方案2】:我评论下方的信息不足以清楚地了解您的代码,但我在想是否有可能做一些类似于 C# 对事件所做的事情,您可以在其中注册事件和触发的类(在这种情况下,您的基类)可以实现函数指针列表(指向派生方法,在这种情况下,您必须拥有派生类的实例)并调用所有函数指针然后迭代该列表。只是一个想法,不知道是不是你需要的。
【讨论】:
这可能是一种解决方案,是的,但 atm 我认为复合设计模式是更好的选择【参考方案3】:没有办法自动完成。获得效果的一个简单方法是让每个派生类调用其基类的函数:
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
也很好——它不关心更新,但它的基类的函数仍然可以被调用。所以这对实现者来说不是一个巨大的负担,他们只需要遵循如果他们实现函数,他们必须调用基的规则。
另一种方法可能是基类保留对更新感兴趣的“侦听器”列表,并在更新发生时依次调用它们。然后每个派生类都可以注册一个合适的监听器。
但是,如果每个级别都进行更改但一个或多个级别可能会抛出,则可能很难使这种异常安全的代码。
【讨论】:
以上是关于是否有可能有一个基类方法调用其所有派生类的相同(但被覆盖的方法)?的主要内容,如果未能解决你的问题,请参考以下文章