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。總而言之,雖然這個語言不支持它,但是任何實現都會變得有點笨拙。 –