回答
擴展方法不是面向對象的語言功能。 (相比:類,繼承,多態等)。
與每種語言功能一樣,應該在適用的地方和設計目的的地方使用。關於何時以及如何使用擴展方法已經有幾十個問題。
擴展方法只是一種語言功能。他們在對象實例上工作,是非常好的工具。
將它們視爲擴展類功能的另一種方法。通過增加部分類聲明
:您可以添加一個類的新功能。然後該類立即獲得一堆新的方法和屬性。
通過在您的擴展方法持有者類中包含名稱空間。然後該類再次獲得一堆新的方法。
而是一個組織/語言功能。不以任何方式打破面向對象的概念。正如C/C++中的頭文件/源文件除法與面向對象無關,只是語言/框架功能。
這取決於。擴展方法只是一個工具。如果使用得當,它們可能非常有用。但是,如果你使用它們太多,它會掩蓋你的代碼。
有兩部分。
使用它時是否OO 否;它讓你覺得你是在特定類型的
難道OO基於它是如何編譯調用方法/內置
是;編譯的代碼具有使用在其上調用擴展方法
擴展方法只是與特定類或類層次工作靜態方法的對象的靜態方法。 Python是OO,但有模塊,Ruby有mixin。我更多地將它看作一種語言功能。我敢肯定它仍然OO友好
埃裏克利珀有blogged about this,我懷疑我不能做的更好,而不是引用他的話:
所以,是的,經常聽到批評 「延伸方法不是 面向對象「是完全正確的,但也相當無關。擴展 方法肯定不是 面向對象的。他們把操縱數據遠 從聲明中的數據, 他們不能打破封裝和 再跟他們似乎是在, 他們不玩方法 對象的私有狀態以及與代碼的代碼 繼承,等等。他們是在一個方便 面向對象的禮服 過程編程。
它們也非常方便, 使LINQ成爲可能,這就是爲什麼我們 添加它們。事實上,他們不 符合一些哲學理想 是什麼使面嚮對象語言 並不是真正的因素在 該決定。
我會然而補充一點,他們不僅僅是LINQ有用的 - 出於同樣的原因,他們是在LINQ有用。能夠表達能夠在特定接口的任意實現上工作的算法(如LINQ to Obhects中的IEnumerable<T>
)真的很棒。這樣的算法通常沒有任何超出您正在處理的接口的上下文,所以它們通常自然是靜態的。
如果你接受你有一些靜態工具方法,你寧願使用哪種語法?
// Traditional
CollectionUtils.Sort(collection);
// Extension methods
collection.Sort();
後者在我看來只是更具可讀性。它簡潔地表達你想要做的事情。它並沒有說清楚你想怎麼做,但這對於大多數來說並不重要 - 當然,當你調試某一行時更重要。
- 1. 擴展方法和擴展屬性是不好的做法嗎?
- 2. C#擴展方法與特定屬性
- 3. 這是一種在JavaScript中擴展對象的新方法嗎?
- 4. 面向對象的方法C#
- 5. javascript對象可擴展性限制方法嗎?
- 6. 不是面向對象的buildMaxHeap方法
- 7. LINQ方法是擴展方法嗎?
- 8. 在面向對象的PHP中擴展對象
- 9. 這是不好的面向對象編程嗎?通過方法
- 10. 僅限於包含特定屬性的對象的擴展方法
- 11. 擴展方法隱藏相關性嗎?
- 12. 有用的擴展方法日期對象的C#庫
- 13. jquery:擴展與兩個對象的方法 - 結果是對象對象?
- 14. 面向對象的方法是什麼? (或你的方法?)
- 15. c中的擴展方法#
- 16. 什麼是C#後面的擴展方法的設計動機
- 17. 簡單程序的面向對象,可擴展性和模塊性
- 18. C#擴展方法
- 19. C# - 擴展方法
- 20. C#擴展方法
- 21. 事件是GOTO的面向對象嗎?
- 22. Erlang是面向對象的嗎?
- 23. C#並行擴展Task.Factory.StartNew調用錯誤對象的方法
- 24. C#:這是一個ASP.NET項目的合理擴展方法嗎?
- 25. 擴展對象的類方法 - 正確的方法
- 26. C#伯爵()擴展方法性能
- 27. log4net和C#擴展方法|性能
- 28. 方法的擴展方法C#
- 29. android中的面向對象的方法
- 30. C#Dynamic擴展對象
聽起來像 「如果它不是面向對象的,我們不應該使用它。」 – 2009-11-26 09:05:42
噪音 - 這在SO上被問過很多次 – 2009-11-26 09:34:12