2012-08-14 61 views
1

我用來實例對象如下:實例化和界面

type obj-name = new type(); 

,現在我使用

IList<string> str_element = new List<string>(); 

我期待看到的東西

IList<string> actors = new IList<string>(); 

能有人給我一些想法,爲什麼接口實例化在這裏是不同的?

感謝,
阿米特

回答

4

的接口就是這樣—的接口,還是應該有哪些方法的規範。
一個接口不包含任何實際的代碼。

接口只能用作持有具體類的類型。
創建接口的實例沒有任何意義,因爲沒有什麼可以實例化。

+1

擊敗我30秒! – 2012-08-14 23:55:10

3

你無法做的原因= new IList<string>()是因爲IList<T>是一個接口,你不能初始化接口,因爲沒有任何代碼可以調用。我會推薦做

List<string> actors = new List<string>() 

改爲。

+0

不要誤會我這個作品,但我想知道,但在這些答案後,我想起了我在OOP讀過的關於界面的東西! – 2012-08-15 00:03:40

0

你可以使用LINQ:例如

這會給你一個更具體類型的東西。

using System.Linq; 

IList<Foo> list = new List<Foo>(); 
IEnumerable<Foo> sortedEnum = list.OrderBy(f=>f.Bar); 
IList<Foo> sortedList = sortedEnum.ToList() 
+0

我知道科爾我只是舉了一個例子,但這並不意味着他不想排序..我看到了演員,所以這就是爲什麼我發佈的例子抱歉.. – MethodMan 2012-08-15 00:08:06

1

接口定義一個合同,或一組功能,即實現類必須提供(至少)。通過定義一個類型爲IList<T>的變量,您確實在說:「我不在乎實際的實現是什麼,它只是需要提供該功能。」這意味着你在調用代碼中分離了「接口」和「實現」,這是一件好事。

接口的真正威力在於你擁有可插拔的代碼。如果您定義了一個庫,而不是返回一個實例,則可以返回一個實例(該AFAIK是LINQ功能的作用)。這允許你改變返回對象的內部實現(它可能是一個鏈表或B樹,或其他),並且調用代碼不需要改變。

大部分模擬庫(例如NMock,Moq等)都利用接口並可以爲測試目的生成實現類。