CLOS 有一个简洁的 :before、:after 和 :around 方法概念。
- :before 方法在主要方法之前调用。
- :after 方法在主要方法之后调用。
- :around 方法是围绕 :before+primary+:after 序列调用的。
:before、:after 和 :around 方法是链接的而不是重写的。假设父类和子类都定义了 foo 方法和 :before foo 方法。子级的 foo 方法会覆盖父级的 foo 方法,但子级和父级的 :before foo 方法都会在调用此覆盖的方法之前调用。
Python 装饰器提供了类似于 CLOS :around 方法的东西。 C++ 中没有这样的东西。必须用手卷:
class Child : public Parent {
virtual void do_something (Elided arguments) {
do_some_preliminary_stuff();
Parent::do_something (arguments);
do_some_followup_stuff();
}
};
缺点:
- 对于某些人来说,这是一种反模式。
- 它要求我明确指定父类。
- 它要求我的课程的扩展者遵循相同的范例。
- 如果我需要打电话给祖父母怎么办,因为父母没有覆盖
do_something
,那么多重继承呢?
- 它并没有完全体现 CLOS 概念。
当我使用 Flavors(CLOS 的前身)时,我发现这些概念非常方便。我在一些地方使用了上述解决方法,并且一些地方将其作为反模式提出了挑战。 (其他人在其他地方也效仿过,所以这种嘲笑并不普遍。)
问题:这是否被认为是 C++ 中的反模式,是否有更好的解决方法?
您可以使用以下方法很好地了解这方面的基础知识(std/boost)::shared_ptr
。详细信息请参见这里:http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/sp_techniques.html#wrapper http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/sp_techniques.html#wrapper
获得您提到的继承行为只需要前缀/后缀函数来调用父类中的前缀/后缀函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)