最後幾天,我常常遇到「實現接口」這個術語...我有一個想法是什麼,但我想了解更多信息和一些關於它的資源。什麼時候一個類實現一個接口?「實現接口」究竟意味着什麼?
回答
一個接口是一個合同,指定所要求的組,類必須創建方法。
例如:
public interface ITest
{
public void DoSomething(int someInt);
}
public class MyClass : ITest
{
public void DoSomething(int someInt)
{
... Do some stuff
}
}
如果不包括DoSomething
方法,編譯器將拋出一個錯誤。
接口通常是功能,他們需要作爲參數,他們將返回的內容的說明。描述如何使用函數以及您可能期望從中返回的內容。
實現接口意味着實際編寫一些代碼來實現接口的描述,在功能名稱,屬性和返回值。
接口爲您的代碼添加透明度。一個接口定義了一個由類實現的合約。假設我告訴你,你可以成爲我的幫派的一部分,但你一直需要穿綠色襯衫。如果你說是,那麼你正在執行合同,現在你必須一直穿綠色的襯衫。
接口是類必須實現的功能的規範。當你實現一個接口時,你要爲你的類的任何消費者指定你提供給定接口中定義的功能。例如(在C#):
public interface ISearchable
{
List<object> Search(string query);
}
ISearchable
是指定一個單一的方法,該方法,在理論上,應該提供一類一些搜索功能的接口。現在,要實現搜索功能的任何類可以實現ISearchable
接口:
public class ConcreteSearchable : ISearchable
{
public List<object> Search(string query)
{
// Implementation
}
}
您現在有一個實現你的ISearchable
接口的類。這提供了幾個好處。首先,你明確地聲明瞭你的類的某些行爲。其次,你現在可以將你的類(和其他接口的實現)多態化。
例如,如果執行ISearchable
接口的類型很多,則可以創建SearchableFactory
,它將根據某些參數構造具體類型。工廠的消費者不會在意具體類型......只要他們可以搜索一下:
public class SearchableFactory
{
public static ISearchable CreateInstance(string query)
{
if(query.Contains("SELECT"))
return new SqlSearchable();
else
return new ConcreteSearchable();
}
}
的接口是一類需要實現的方法的列表。這是一種解耦類與類提供什麼服務的工作方式。
您可以想象一個堆棧數據結構。它可能在其界面如下:
push(Node);
Node pop();
Node peek();
現在,如果你使用一個數組來實現你保住的索引到一個數組堆棧,並用它來執行操作。如果你有一個鏈表,你只需要一個指向頭部的指針。接口的要點是,只要您的實現提供了所需的方法,您的實現的用戶不需要知道您的實現類如何工作。
某些語言(如Java和C#)提供了明確的interfaces。其他人,比如ruby或者python,可以讓你使用相同的技術,但是不能用關鍵字來強制執行。您可能會聽到術語Duck Typing。這是一種說法,如果某件事實現了正確的接口,則可以使用它,而不管實現如何。
實現接口是什麼意思?
如果我們從一個接口開始,然後再着手實現其中的一種方法,那麼也許是最好的。
例子#1:
每一個麥當勞在世界上具有一定的共性。事實上,如果你想運行一個麥當勞的特許經營,你必須按照他們的加盟商規則:
- 割愛巨無霸。
- 餐廳必須有一個大M
- 必須支付加盟商費用。
- 餐廳必須始終保持清潔(原文!?)。
這些是他們的規則。它在合同中。每家餐廳都必須遵守該合同。每家餐廳都略有不同,但在上述規則中都是一樣的。
這對客戶來說也是一件好事。如果你走進世界上任何一家麥當勞餐廳,你肯定知道你可以購買一臺巨無霸。
麥當勞與接口有什麼關係?
「接口」只不過是一個合同。任何「實施」或簽署合同的餐館都必須遵守。或者換句話說,任何實施麥當勞加盟商界面的餐廳都必然會遵循它。
爲什麼它被稱爲IMcDonald的界面而不是麥當勞界面?
當你命名一個接口時,名稱以「I」開始的習慣是常見的。
例2
世界上所有的飛機有一定的共性,不管是什麼類型。換句話說,他們都實現了Iplane接口。
的IPLANE接口規定,它實現任意平面它必須有:
- 兩翼
- 發動機
- ,它必須飛
因此,如果波音737以下這些規則,作爲一個客戶,你保證你的購買將有翅膀,並會飛。下面是一個波音737實現上述接口的例子:
public interface IPlane
{
void Fly();
void HasTWoWings();
void Engine();
}
class Boeing737 : IPlane // <-------------- the Boeing 737 implements the interface
{
// this means that the Boeing737 MUST have a fly, hastwowings and an engine method.
// the interface doesn't specify HOW the plane must fly. So long as it does fly
// the compiler doesn't care.
public void Fly()
{
Console.WriteLine("Come fly with me, let's fly, let's fly awaaaaaaaay");
}
public void HasTWoWings()
{
Console.WriteLine("I've got two wings");
}
public void Engine()
{
Console.WriteLine("BRrrrrrrrooooooooooooooooooooooooooooooooom!");
}
}
我希望幫助你的鄉親。
那麼這有什麼用?
如果您想要預訂飛機的乘客,這變得非常方便。你不確定哪些飛機會爲你提供。只要它們是飛機,只要它們飛行,並且有兩個機翼和一個引擎,你就不會在乎。當你在機場時,你可能會得到一架波音飛機,或者你可能會獲得空中客車,或者你可能會得到一個斯蒂格 - 但是你知道,不管你獲得什麼樣的飛機,他們都會從事某項工作。他們可能以不同的方式飛行,但他們都飛。
這使您可以以這種方式編寫代碼,從而最大限度地降低維護成本並使修改更容易,而不會導致錯誤。
- 1. 「雲計算」究竟意味着什麼?
- 2. AspNetCompatibilityRequirements究竟意味着什麼?
- 3. Cocoapods平臺,究竟意味着什麼?
- 4. 「帶外庫」究竟意味着什麼?
- 5. xmlns =「」究竟意味着什麼
- 6. flex標籤究竟意味着什麼?
- 7. TE和NT究竟意味着什麼
- 8. Composable究竟意味着什麼?
- 9. jquery:「$(this)」究竟意味着什麼?
- 10. struct.calcsize('P')究竟意味着什麼?
- 11. UrlReferrer究竟意味着什麼?
- 12. 「有效」究竟意味着什麼
- 13. @Secured({「ROLE_USER」,「ROLE_ADMIN」})究竟意味着什麼
- 14. 這究竟意味着什麼?
- 15. 響應者究竟意味着什麼?
- 16. max_connections究竟意味着什麼?
- 17. 異步NSUrlConnection究竟意味着什麼?
- 18. curlopt_binarytranfer究竟意味着什麼?
- 19. 「就地」究竟意味着什麼?
- 20. 這個內部連接查詢究竟意味着什麼?
- 21. 什麼是printf定義中的__format究竟意味着什麼?
- 22. 什麼不透明的內容究竟意味着什麼?
- 23. 那麼「return 0」究竟意味着什麼呢?
- 24. 究竟是「拋出」意味着OOP
- 25. 「無格式輸入函數」究竟意味着什麼?
- 26. 建模轉換究竟意味着什麼?
- 27. 模板引擎在計算中究竟意味着什麼?
- 28. 這些liferay config params究竟意味着什麼?
- 29. Java「user.dir」屬性 - 它究竟意味着什麼?
- 30. 在DWARF信息中,DW_OP寄存器究竟意味着什麼?
這是一個騙局......更不用說這個Google上無數的非SO源會發現如果問。 – delnan 2010-11-10 15:33:16
爲什麼你不提供鏈接呢? – rabidmachine9 2010-11-10 15:35:07
Like [面向對象編程中接口的定義是什麼](http://stackoverflow.com/q/2866987/15880)? – Powerlord 2010-11-10 15:43:30