自從面向對象開發方式的出現,抽象的概念就開始日新月異的發展,面向對象編程、面向接口編程、面向組件編程等等;這一系列的概念都是軟件工程所追求的思想范疇,高類聚低耦合。
今天我要簡談的是面向對象里面非常重要的也是非常抽象的概念,接口。談起接口多少人曾經為之痛苦過,尤其是一些剛入門的開發人員(包括小弟),百思不得其解,啥叫接口,接口能干嘛用,用不用有什么區別;等等問題困擾着,這些問題不解決不弄明白,很難在面向對象領域混,更別談面向對象開發了,可能有人認為面向對象開發就是麻煩我不用一樣也能開發,開發一個項目又是分這個層,又是分那個層的,繁瑣。這中情況我就沒有權利去發表任何意見了。仁者見仁智者見智吧;
接口是面向對象里面非常重要的概念,我們暫且不談面向對象里面的接口;其實接口在我們日常生活中到處可見,比如自來水的水管、燃氣閥門、電視機的插頭等等;在面向對象里面的接口概念其實跟這些都是大同小異的。為什么要提倡進行面向對象軟件開發呢,我想就是將我們開發的方式完全能模仿自然界的生存規律,在沒有徹底理解面向對象里面的接口時,請注意千萬不要自己欺騙自己,簡單的自已打個比方就OK了(別人這么說,我也這么想一下),這些問題一定要搞清楚,本人有過成功理解面向接口的經驗,希望通過本文章能幫助您小理解一下;后面的升華(面向對象設計、面向接口設計等等),還得靠自己去摸索。我們再來看一下,在我們計算機里面存在哪些接口,比如我們的硬件與OS的接口,硬件存在的數量數不勝數,各種各樣,要想完全能與OS對接,能讓我們的軟件使用,必須遵循一定的接口,在我們的OS與硬件之間存在着一層,硬件抽象層;
請看圖:
什么叫硬件抽象層:硬件抽象層是位於操作系統內核與硬件電路之間的接口層,其目的在於將硬件抽象化;目的就是使用這一層來抽象化所有的硬件接口,對上層使用統一的接口調用;根本不需要關注有哪些硬件,只要大家都遵循一致的接口就能互相通訊,互相調用;有一位大師曾經說過:在計算機科學領域里任何一個問題都能通過添加一個間接層來解決;這里的接口是一個比較大的開發思想,但是它與代碼中的接口概念是完全一樣的,都是提高抽象性,提高獨立性;
我們回到開發代碼中來,我就拿.NET來示范了(本人只會C#),在某一個編程語言里面的接口其實就和上面的硬件接口層是一個意思,我們拿一個例子來說吧,我就奉獻我認為最能說明接口問題的例子,這個例子一直伴隨着本人理解到現在,每當我有問題時,我就利用這個例子來打比方,其實很簡單的一個例子,就是完全模仿現實生活中的場景,也是面向對象所最求的精髓;都說演員要感受生活才能演好戲,我們程序員也要感受生活才能寫出好的程序;(開個玩笑)
例子:假如我是一家生產水管公司的老板,我要生產所有能被家庭、工廠、企業使用的水管;要想生產這些水管,就必須要知道這些水管能與家庭、工廠、企業進行對接的條件,家庭、工廠、企業都使用些什么規格、型號的水管;這些東西那里來,找啊;注意這里就形成了第一個接口,各廠家的水管規格、型號說明書,這個說明書就是我們這里的接口;知道了各個生產廠商的水管的規格、型號說明書,我就知道怎么與之對接了;
請看圖:
各個廠商都公布了自己公司生產的商品的一系列說明性信息,只要我們找到了這些信息就可以生產了;我們把圖轉換成C#代碼,請看圖:
在我們解決方案中有三家廠商公布了說明書,內容是,請看圖:
我這里就給出一個屬性,水管的半徑;在接口里面不得有任何的實現代碼,只能是申明要實現的代碼;讓要實現的對象去完成;這個接口的作用就是當我生產的水管與廠商的水管進行對接時,要去讀取的屬性標識;記住,接口是實現的定義,是一種規則,一種描述,不不包括實現代碼;
有了說明書我要回去生產了,請看圖:
代碼圖請看:
在項目里面多了一個本公司的項目,我們引用生產商1,然后實現規格說明書接口,請看圖:
實現了接口,就可以與生產商1的產品進行對接了;記住,任何一個公開的接口,接口里面的東西都是公開方必須要使用到的東西,必須實現;仔細想想我們生活中,當一個水閥門沒有開關時,那是多可怕的;下面實現對接,請看圖:
任何接口的實現在最后都會被調用,所以這是接口的本質,它將實現的規格對外公開,讓大家去實現,只要遵循接口就等於它自己的實現;面向對象編程的最高境界就是面向接口編程,接口就好比一個工程的工程圖紙,只要將圖紙給包工頭,讓他去實施就OK了;請看代碼圖:
接口就講完了,簡簡單單的代碼希望您能看的懂;最后我們總結一句:
接口就好比我們自然界中的說明文檔,而實現就是我們依照說明文當生產出來的能使用的實體,接口是一切事物的抽象定義,一切事物的抽象描述;