2016-03-14 51 views
-1

我剛剛瞭解到,在C#中,您可以在技術上將數據存儲在接口中。看下面的例子。用這個例子接口和類:包含數據引用的接口

public interface IInterface 
{ 
    int id { get; set; } 
} 

public class ExampleClass : IInterface 
{ 
    public int id { get; set; } 
} 

和示例程序。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var newExample = new exampleClass(); 
     newExample.id = 5; 

     IInterface exInterface = newExample; 

     Console.WriteLine(exInterface.id); 

     Console.ReadLine(); 
    } 
} 

我會得到5的輸出。爲什麼?我認爲接口沒有存儲結構以外的任何東西。這種間接存儲和引用是否有技術術語?這不是很糟糕,因爲這個功能是隱藏的嗎?我永遠不會想到引用一個接口上的屬性來檢索實際數據,這是一個對象的目的。

請讓我知道如果格式是錯誤的或我需要清除任何事情。謝謝!

+0

該值在類中顯示出來,但是如果您有兩個類實現您的接口將會非常有用 – Boo

+0

這兩個變量都引用了相同的內存。爲什麼你會期望同樣的內存包含兩個不同的值?賦值不會複製任何內容,只需將兩個引用設置爲相同的對象實例即可。 –

+0

基本上你所做的所有事情都是將'ExampleClass'強制轉換爲接口。你檢索的值仍然來自'''''newExample''。接口提供了一個必須由類提供的契約,因此我們知道如果我們有一個'IInterface',它必須提供一個返回int的屬性'id'。沒有隱藏的功能,你只需調用由'object'實現的類接口。 –

回答

1

接口沒有存儲任何數據。將接口想象爲(鬆散地)描述一個合同,它說「實現我的任何類必須提供以下屬性/方法」。

此代碼

var newExample = new ExampleClass(); 
    newExample.id = 5; 

是這樣做的:

創建的ExampleClass一個新實例,並指定5〜 的id屬性的值。

但是,此代碼

IInterface exInterface = newExample; 

是說這樣的:

角色(變化)newExample實例到接口IInterface的一個實例。

這是什麼意思是,你訪問exInterface變量的任何時候,你只能訪問該接口中定義的那些屬性/方法(即使你的類可能有其他屬性定義/方法)。

您永遠無法創建接口的實例。它始終在創建實現該接口的類的實例的上下文中。如果您將該實例轉換爲接口,那麼您基本上使用「最小公分母」類型的方法,並限制對該接口定義的內容的訪問。

+0

啊,「最小公分母」類型的方法的想法點擊我。非常感謝您的幫助! – Willwsharp