CLOS有一个简洁的概念:before,:after和:around方法。CLOS:在C++之前,之后和之后:在C++中围绕
- The:before方法在主方法之前被调用。
- :在主方法之后调用方法之后。
- :around方法被调用:before + primary +:after序列。
The:before,:after,and:around方法被链接而不是被覆盖。假设父类和子类都定义了一个foo方法和:before foo方法。孩子的foo方法覆盖父母的foo方法,但是孩子和父母的方法:在调用此重写的方法之前调用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++中的反模式,是否有更好的解决方法?
不错。你做了do_something虚拟意味着一个派生类可以覆盖它,如果它通过调用super :: do_something来实现,那么CLOS也是:around。总而言之,虽然这个语言不支持它,但是任何实现都会变得有点笨拙。 –