2010-08-31 68 views

回答

5

基於接口的編程不涉及內存消耗 - 這是一種增加關注點分離的技術。

當您使用接口作爲參數(例如)時,您仍然需要傳入實現該接口的實際對象。您將通過接口訪問它,並且您可以用實現該接口的任何其他對象替換它。這就是你如何創建一個解耦方法。對於傳入的實際對象,您仍然需要內存。

+0

假設我有一個屬性類P,不包含數據僅成員方法定義一個C類。當我C的對象沒有分配給它的內存。 當我調用C的所有方法的對象的方法被加載到內存中。 但是當我通過調用函數的接口調用被加載到內存時... – vksh 2010-08-31 12:13:52

+0

不太確定,只是一個假設 – vksh 2010-08-31 12:14:35

+0

@vikesh - 接口不能被實例化。只有物體可以。當然,如果一個實現需要更少的內存,那麼如果使用它,則會使用更少的內存。 – Oded 2010-08-31 12:23:16

2

如果通過接口或通過對對象的引用調用方法,則無關緊要。接口引用仍然引用一個實例。該類型有許多方法,這些方法在加載類型時加載(並根據需要編譯JIT)。

0

不,調用使用接口的方法和使用類調用方法沒有實際區別。

當你使用一個接口時,只是你的參考是不同的。該參考仍指向一個類的實例。由於接口本身不包含任何實現,所以不能有接口的實例,所以在另一端總是存在一個類的實例。

0

將什麼方法加載到內存中與接口無關。在.NET中,當方法首次被調用時,它被編譯成本地代碼,然後保存在內存中。無論您如何訪問它(無論是直接,通過界面還是使用委託)都無關緊要。

此外,方法本身的內存消耗應該非常低,沒有你應該關心的東西。

0

含糊不清的問題。我猜你在問是否使用界面會導致你使用的任何語言的性能損失。

答案是對於C++(純虛函數)來說,是的。在某些非常多的情況下可能很重要。

對於Java(和.Net可能),不是真的。

參見:Overhead of implementing an interface