※ 引述《ZooseWu (動物園)》之銘言:
: 我有兩個class A 與 B
: 他們有80%的功能與函示名稱相似
: 然後我只有runtime的時候才知道物件身上有哪一個class
: 我有一個好方法可以簡單的呼叫 (A|B).function嗎
: 對了class不是我寫的
: 所以我沒辦法透過寫interface然後讓AB繼承這種方法
碰到奇怪的東西我偶爾會這樣做:
基底類別:
01. class ISubject
02. {
03. protected:
04. virtual bool Prepare(Input* input) = 0;
05. virtual bool Excute(Input* input) = 0;
06. virtual bool Finish(Input* input) = 0;
07.
08. public:
09. virtual bool Do(Input* input) = 0;
10. };
共通線:
01. class SubjectBase : public ISubject
02. {
03. protected:
04. virtual bool Prepare(Input* input) override
05. {
06. // 做點初始化跟共通會做的事情
07. }
08.
09. virtual bool Excute(Input* input) override
10. {
11. // 留白
12. }
13.
14. virtual bool Finish(Input* input) override
15. {
16. // 做點收尾跟釋放資源的事情
17. }
18.
19. public:
20. virtual bool Do(Input* input)
21. {
22. if(!Prepare(input))
23. {
24. // 初始化出錯,輸出錯誤
25. return false;
26. }
27.
28. if(!Excute(input))
29. {
30. // 執行階段出錯,輸出錯誤
31. return false;
32. }
33.
34. if(!Finish(input))
35. {
36. // 釋放資源階段出錯,輸出錯誤
37. return false;
38. }
39.
40. return true;
41. }
42. };
個人線:
1. class SubjectA : SubjectBase
2. {
3. protected:
4. virtual bool Excute(Input* input) override
5. {
6. // 做點SubjectA會做的事
7. }
8. };
以此類推
最後看你要用map還是啥弄一個分支
執行靠呼叫Do(input);
缺點是寫起來很麻煩
對只有幾個的有點過去包裝
優點是寫完後很懶人
尤其是當你要處理幾十幾百個上古遺物的時候
只要開一個小class去繼承就能直接寫
我只會靜態語言 對ㄚ==