2011-06-16 78 views
1

我有一個函數(實際上來自ATL,它是ATL::CSoapMSXMLInetClient::SendRequest(LPCTSTR)),其行爲應該是略微被修改。也就是說,我只需要在函數的中間添加一個函數調用。如何修改沒有模板方法的函數行爲?

考慮到這不是模板方法,改變其行爲的最佳實踐是什麼?我是否需要重新編寫整個功能?

在此先感謝。

編輯:從類ATL::CSoapMSXMLInetClient和複製粘貼功能全碼推導在子類函數定義稍作修改不起作用,因爲大部分ATL::CSoapMSXMLInetClient::SendRequest使用的成員是「私人」和訪問他們的子類是編譯時錯誤。

而不是最佳實踐,我正在尋找一種方法來實現它,如果有的話。 :(

+0

爲什麼不使用模板方法?在正確的地方撥打受保護的虛擬方法。在基類中實現受保護的方法作爲空方法,然後在子類中重寫。 – gregg 2011-06-16 14:35:45

+0

我不能改變基類,因爲它是ATL類 – 2011-06-16 14:37:52

回答

2

是的,你會的。如果它在功能的中間有無法逃避的方式。

+0

,但我真的不想:P無論如何,似乎我將不得不:/謝謝回答 – 2011-06-16 08:45:17

+0

以及如果SendRequest中使用的幾乎所有基類成員都是私有的...我不能簡單地將代碼複製粘貼到派生類... – 2011-06-16 08:55:42

1

有可以使用一些重構方法,但我想不出任何漂亮的人,以及很大程度上都依賴於類中的代碼,雖然你情況下,可能很難找到任何工作

一樣,如果你有一個行:

do_frobnicate(); 
dingbat->pling(); 

而你需要調用somefunc()在dingbat plings之後,你可以,如果dingbat是一個界面的話你提供了一個新的dingbat,它也會在定位的時候執行somefunc()。鑑於這個dingbat plings唯一的地方是在這個功能。另外,如果do_frobnicate()是一個自由函數,並且您希望在此之後添加somefunc(),則可以在該類中或在其名稱空間中創建一個函數,該函數稱爲相同。這樣你可以製作自己的do_frobnicate(),它也可以做somefunc()。

+0

嗯,我檢查了代碼,但我沒有這樣的功能,我可以修改。我的情況很像: func(x); func(y); 我想添加func(z);它們之間。但是,無論如何謝謝你的答案:) – 2011-06-16 09:06:55

+0

希望這可能有助於其他人尋找類似的答案。 – daramarak 2011-06-17 12:23:05

相關問題