是否有一種方法可以在C和/或C++中實現類類別(Objective-C)或擴展方法(C#3.0)的功能?在C或C++中,有沒有辦法擴展一個沒有繼承的類?
回答
關於C#的擴展方法:不直接。 C++對這些東西的需求較少,因爲C++支持免費函數。我從來沒有使用Objective-C,所以我不能在那裏發表評論。
C++沒有密封類或單個類繼承,因此在大多數情況下,您可以繼承基類。有一些創造性的方法可以使課堂不可繼承,但是它們之間並不多見。一般來說,C++沒有產生擴展方法的問題。
C不是面向對象的,所以這個問題並不適用。
什麼「C#中的問題」催生了擴展方法?擴展方法僅用於支持LINQ,這是C++在任何描述中都沒有的功能。 – 2010-05-28 01:14:38
密封類和單類可繼承。除了LINQ擴展方法之外,還提供了擴展類的功能的能力,這在封閉類時是不可能的(比如'string')。同樣,對繼承一個類的限制也限制了你添加mixin的能力。 – 2010-05-28 01:17:58
是的,但C++中的類在沒有虛擬析構函數時被有效密封,所以我沒有看到C++如何不具有相同的問題。 – 2010-05-28 01:21:39
您可以使用接口嗎?擴展方法是避免子類化的一種簡單方法,但是當使用適當的OO技術時,它們會變得半無用。他們與Linq一起使用的原因是,VS團隊不必去更新那些很可能破壞很多遺留應用程序的代碼。
每MSDN: 「一般情況下,我們建議您採用擴展方法謹慎,只有當你要儘可能的客戶端代碼必須通過創建從現有派生的新類型擴展現有的類型應該這樣做。類型。」
雖然有一個LinqList會讓我微笑。 – 2010-05-28 01:27:12
不是真的。這不是像這樣對待類的C++方式。邁爾斯認爲,最好有一個小班,以最少的一組操作,使其充分有用。如果要擴展功能集,可以添加一個實用程序名稱空間(例如名稱空間ClassUtil),該實用程序名稱空間包含在該最小類上運行的非成員實用程序函數。從任何地方向函數名稱空間添加函數都很簡單。
您可以檢查有關主題here的討論。
免費功能是要走的路。 – 2010-05-28 08:05:56
C++具有免費函數,但有時擴展方法在將許多函數嵌套在一起時效果更好。看看這個C#代碼:
var r = numbers.Where(x => x > 2).Select(x => x * x);
如果我們在C++中使用免費的功能寫這一點,應該是這樣的:
auto r = select(where(numbers, [](int x) { return x > 2; }), [](int x) { return x * x; });
這不僅是難以閱讀,但也很難寫。解決這個問題的常用方法是創建所謂的可調用函數。這些函數是通過重載|
管道運算符(這只是真正的運算符)而創建的。所以上面的代碼可以這樣寫:
auto r = numbers | where([](int x) { return x > 2; }) | select([](int x) { return x * x; });
這是更容易閱讀和寫入。許多庫對範圍使用pipable函數,但它也可以擴展到其他類。 Boost在它們的range庫中使用它,pstade oven使用它,並且此C++ linq庫也使用它。
如果你想編寫自己的pipble函數,請解釋如何做到這一點here。但是,其他庫提供函數適配器以使其更容易。Pstade雞蛋有一個pipable adaptor,linq提供了range_extension
適配器來創建一個至少爲範圍的可調函數。
使用LINQ,首先您只需建立功能函數對象是這樣的:
struct contains_t
{
template<class Range, class T>
bool operator()(Range && r, T && x) const
{ return (r | linq::find(x)) != boost::end(r); };
};
然後你使用靜態初始化這樣的初始化函數:
range_extension<contains_t> contains = {};
然後你可以使用你的pipble功能是這樣的:
if (numbers | contains(5)) printf("We have a 5");
- 1. 有沒有辦法繼承/繼承/擴展javascript WebSocket?
- 2. 有沒有辦法從C#中的多個類繼承屬性?
- 3. C++:有沒有辦法指定一個從另一個繼承的泛化類?
- 4. 有沒有在C#方法繼承
- 5. 有沒有辦法在Chrome擴展中使用C++?
- 6. 有沒有辦法在C++中擴展動態內存數組?
- 7. EditorTemplate繼承 - 有沒有辦法
- 8. 擴展類沒有多重繼承或重複的代碼
- 9. 有沒有辦法限制哪些類型被允許繼承我的C#類?
- 10. 有沒有辦法在PHP中繼承ffmpeg_movie類?
- 11. 有沒有辦法在Chrome擴展中加載一個applet?
- 12. 有沒有辦法擴展swig/python中的所有類?
- 13. 有沒有辦法在css中繼承這個繼承的填充?
- 14. 有沒有辦法在VueJS中繼承帶有mixin的模板
- 15. Objective-C - 添加一些屬性而不擴展類,有沒有辦法?
- 16. 有沒有辦法'擴展'#define指令?
- 17. 有沒有辦法擴展ThreeJS對象?
- 18. 有沒有辦法在Python中識別繼承的方法?
- 19. 類沒有繼承 - 類沒有找到
- 20. psutil沒有C擴展
- 21. 有沒有辦法使用擴展類類型的Java集合?
- 22. 有沒有辦法在C#中繼續異常?
- 23. 有沒有辦法在一個超類定義一個通用的方法來引用繼承類的類型?
- 24. 有沒有什麼辦法從TriggerAction類繼承?
- 25. 有沒有辦法讓一個文本框自動擴展沒有jQuery?
- 26. 用Webpack捆綁ES6類。有沒有辦法提升擴展類?
- 27. 有沒有辦法在C#中的WinForms或WPF的3D遊戲?
- 28. Erlang:有沒有辦法在-spec中「繼承」?
- 29. 有關類擴展和繼承問題在Objective-C
- 30. C#檢測沒有擴展名的文件類型沒有長碼或標記
你可以在C中實現你想要的任何功能。你可以不過添加功能。 – WhirlWind 2010-05-28 01:06:05