回答
C#語言在這裏完全不相關。問題是攔截在運行時級別如何工作。
一種技術是繼承類/實現接口並將其用作代理。這顯然只能覆蓋虛擬方法和接口方法。我懷疑Windsor使用這種技術。這種技術的優點是它不需要任何特殊的東西。只需在運行時創建一個類。
另一種方法是使用分析API。這允許您修改任何方法的IL,包括非虛擬方法。這更具侵入性,通常只在測試遺留代碼時才使用。
另一種方法是在構建時使用IL重寫。這可以在您編寫的代碼中添加攔截點,但不會在框架代碼中添加攔截點。
既沒有也沒有。 Windsor通過子類工作,並且只能合理地覆蓋虛擬方法 - 或者可以實現接口。
其他任何事情都需要調試器/探查器掛鉤處於活動狀態,這很難做 - 有些嘲諷框架支持,儘管它們都不是免費的。
我認爲微軟鼴鼠是免費的,可以做到這一點。但我自己並沒有嘗試過。 – CodesInChaos 2012-04-24 14:51:34
痣已退休。它現在被稱爲「Fakes」,是Visual Studio 11的一部分;)http://research.microsoft.com/en-us/projects/moles/ – TomTom 2012-04-25 17:36:52
是的,你需要虛擬的,但這只是因爲微軟已經搞砸了這種行爲,如果你看Java的方法默認情況下打開擴展,你必須明確標記爲密封。
閱讀更多關於SOLID原則,特別是Open Closed Principle。
-1。那麼如何在Java中對selaed方法進行子類化?停止宗教戰爭 - 在測試模擬密封方法和良好框架支持這一點時,有很好的理由。 – TomTom 2012-01-09 07:05:12
TomTom並不是一件宗教性的事情,如果它支持代碼編織,所有的代碼都會很棒,我只是表示,如果你不想,可以在你的代碼中遵循開放的封閉原則,這是一個很好的習慣。我的客人:) – Nexus 2012-01-09 09:53:14
當然。只是爲了方便單元測試而違反項目要求(封閉的API),這是嚴格嘲諷框架的限制。好的甚至可以用另一個類替換一個類中的NEW構造。 – TomTom 2012-01-09 11:44:54
- 1. 有很多虛擬方法的接口?或者只有一個虛擬方法有很多接口?
- 2. 爲什麼C#接口方法未聲明爲抽象或虛擬?
- 3. 爲什麼在實現接口方法時允許虛擬?
- 4. 接口,抽象,或只是虛擬的方法?
- 5. 爲什麼不能將這種虛擬方法內聯?
- 6. 爲什麼這種純虛擬方法不能編譯?
- 7. 爲什麼虛擬表只有在虛擬功能的情況下才需要?
- 8. 爲什麼此方法在未標記爲虛擬時表現爲虛擬?
- 9. 帶空虛的虛擬方法和純虛擬方法有什麼區別?
- 10. 靜態方法不能實現接口方法,爲什麼?
- 11. 爲什麼使用虛擬功能?
- 12. 爲什麼虛擬功能會隱藏?
- 13. 爲什麼我只能有一個虛擬主機?
- 14. 爲什麼虛方法
- 15. 如何截取虛擬機窗口的截圖?
- 16. 爲什麼方法表只包含基類的虛方法?
- 17. 爲什麼接口方法範圍只公開?
- 18. 非虛擬接口 - 如何調用正確的虛擬功能
- 19. 爲什麼編譯器爲非虛擬方法發出callvirt?
- 20. RandomAccess接口,爲什麼沒有方法?
- 21. 爲什麼接口默認方法?
- 22. Boost.Variant與虛擬接口性能
- 23. 虛擬方法
- 24. Stm32虛擬COM端口 - 無法連接
- 25. 爲什麼NHibernate要求實體方法是虛擬的?
- 26. 爲什麼調用這個虛擬方法?
- 27. 使方法變爲虛擬的危險是什麼?
- 28. 爲什麼我的虛擬方法沒有被覆蓋?
- 29. 非虛擬方法和密封方法有什麼區別?
- 30. 爲什麼接口方法不能是「靜態」和「最終」?
我對這項技術也很陌生。剛剛陷入這個錯誤,並沒有使虛擬方法成爲現實。 – 2012-04-24 14:41:47