2010-07-16 43 views
6

只關心.NET CLR如何在內部處理接口?.Net CLR如何在內部實現「接口」?

Q1]當CLR遇到類似,會發生什麼:(下同使用)

simple interface example.

interface ISampleInterface 
    { 
     void SampleMethod(); 
    } 

    class ImplementationClass : ISampleInterface 
    { 
     // Explicit interface member implementation: 
     public void SampleMethod() 
     { 
      // Method implementation. 

     } 

     static void Main() 
     { 
      //Declare an interface instance. 
      ISampleInterface mySampleIntobj = new ImplementationClass(); // (A) 
      // Call the member. 
      mySampleIntobj.SampleMethod(); 

      // Declare an interface instance. 
      ImplementationClass myClassObj = new ImplementationClass(); // (B) 
      //Call the member. 
      myClassObj.SampleMethod(); 

     } 
    } 

Q2:在上述例子中是如何(A)(B)有區別嗎?

問題3:是否Generic Interfaces區別對待?

(詢問基本問題像這些的時候感覺像一個小白......反正....)

THX所有。

+0

因爲這只是部分答案,我會留在這裏。首先在代碼中使用 mySampleIntobj.SampleMethod();和myClassObj.SampleMethod();可能調用兩種不同的方法。第一個將調用與該調用匹配的任何明確實現的方法,第二個不會。只有在沒有明確的方法匹配的情況下,它們纔會調用相同的方法 – 2010-07-16 07:00:33

+0

這是否會編譯? AFAIK,你應該爲(​​B)調用公開'SampleMethod()'。 – Humberto 2010-07-16 13:56:54

+0

哦對了對不起..現在/糾正:) thx :) – Amitd 2010-07-16 16:10:42

回答

2

這些代碼幾乎沒有區別。兩者最終都會調用相同的功能。通過類類型調用方法可能會帶來很小的性能優勢。

如果你想要如何實現這些東西,看看Virtual Method Tables。請參閱this

+0

哇第二個鏈接似乎很難理解:) – Amitd 2010-07-17 07:20:07

+0

不會看完它10次。 – 2010-07-19 22:00:53

+0

閱讀三次,仍然沒有得到它:) ..我繼續嘗試;) – Amitd 2010-07-20 05:39:49

-5

創建對象引用時使用該接口與直接使用類類型實例化相比,被認爲是更好的做法。這是根據接口原理編程的。

這意味着你可以在運行時使用類似依賴注入來改變實現相同接口的具體類,甚至可能是反射。與編程到具體類型相比,如果編程到接口,則不需要更改代碼。

+0

這似乎更好的解釋編程接口http://stackoverflow.com/questions/1848442/what-exactly-is-interface-based-programming – Amitd 2010-07-20 05:47:45

+0

大部分是正確的,但離題。不回答這個問題。 Downvoted。 – 2016-10-28 15:48:31