接口是把隱式公共方法和屬性組合起來,以封裝特定功能的一個集合,。一旦定義了接口,,就可以在類中實現(xiàn)它。這樣,類就可以支持接口所指定的所有屬性和成員,。接口不能單獨存在,;不能進行實例化(因為沒有必要實例化);接口不包括任何實現(xiàn)其成員的代碼而只定義了成員本身,;成員的實現(xiàn)將在實現(xiàn)接口的類中實現(xiàn),。 以上是接口的書本定義,讀完基本不知所云,。就知道了接口與類不一樣,,接口與類都需要定義自身的成員,但接口不能實現(xiàn)成員的功能,。我覺得可以簡單地說:接口是類的更高級抽象(類已經(jīng)是其所要實現(xiàn)的過程的抽象了),,接口定義了類實現(xiàn)的規(guī)范。接口好像是事先定義好的備忘錄,,提醒你,,類需要有這些成員,需要完成這些功能,。但是,,不同的類,他們具體的實現(xiàn)方式則需要你單獨去定義了,。
正如圖中所示,,我們定義了一個IHuman的接口,,以及Student和Teacher兩個類。眾所周知,,學生和老師都是人(雖然他們之間總是或多或少的存在著些許不可調和的矛盾),。因此,學生和老師都有年齡的屬性,、同樣需要吃飯,、睡覺...。 但是,,幾乎可以確定的是,,學生和老師是兩代人,他們之間有代溝,,去完成作為一個人所必須完成的事情的時候,,所采用的方式方法是不同的。同時,,他們也有不同的行為,。比如,,一個30歲的副教授,想必已經(jīng)結婚,,所以需要傳宗接代,、孝敬父母、愛護祖國花朵,、教書育人,、賺錢糊口...。而學生呢,,正值妙齡,,血氣方剛,不甘寂寞,,可想而知... 這樣做有什么好處呢,?畢竟,沒有好處的事情是不會有人去做的,。試想,,我們沒有定義IHuman接口,而是分別定義了Student,、Teacher類,。有一天,一個想兒子想瘋了的家長突然出現(xiàn)在不知所措的學生和老師中間,。你需要重新定義一個Parent類,,他既不去食堂吃飯也不回家睡覺,一切食宿都在賓館解決,。萬一你忘記了Parent也是正常人,,沒有定義Parent如何去睡覺,是不是要讓Parent活活困死呢,?當有一天,,全國千千萬萬的新新人類都來到了校園,你會忘記的事情是不是也將會是千千萬萬,,你害死的鮮活生命何以計數(shù)呢? 當我們有了IHuman接口,,不管怎么說,,家長還是人,我們定義一個parent類: 家長此行的其他目的,,無非是對學生曉之以錢,,對老師動之以禮等等,可以隨他折騰了,。同時,,你還沒有忘記需要完美地解決家長的食宿問題,。所有的新新人類還是人,完全不用擔心你會忘記他們作為人的需求(忘記了,?會有編譯錯誤報告告訴你的...),。 上面只是舉了一個接口與多個類的例子。實際應用中,,我們可以再定義一個ITeacher的接口,,Teacher類對應IHuman和ITeacher兩個接口,分別規(guī)范了老師作為一名人民教師以及一個人的動作,。也就是一個類可以同時實現(xiàn)多個接口,。 不過好像還是不太明白接口與基類的區(qū)別。以下是幾個形象的比喻: 1.飛機會飛,,鳥會飛,,他們都繼承了同一個接口“飛”;然而同樣會飛的F22和鴿子,,一個屬于“飛機”類,,另一個屬于“鳥”類。 總結 以下是我們必須牢記于心的地方,,接口只包含方法,、委托或事件的簽名。方法的實現(xiàn)是在實現(xiàn)接口的類中完成的,接口可以是命名空間或類的成員,,并且可以包含下列成員的簽名:方法,、屬性、索引器,、事件,,一個接口可從一個或多個基接口繼承,。當基類型列表包含基類和接口時,基類必須是列表中的第一項,。實現(xiàn)接口的類可以顯式實現(xiàn)該接口的成員,。顯式實現(xiàn)的成員不能通過類實例訪問,而只能通過接口實例訪問,。 通常認為接口要比基類更加靈活,,類只要實現(xiàn)了某一接口,調用者便可以利用該接口實現(xiàn)多態(tài)訪問,,在組件化開發(fā)中很常用,,由組件規(guī)范定義者去定義一個接口,不同分工的發(fā)人員按照各自的目的去實現(xiàn)這個接口,。而基類的方式相對比較死板,,但有一些比較通用的方法就可以不必在子類中重寫了。二者不能夠說誰的功能更強大,,或者說誰能取代誰,,只是我們可以根據(jù)需要選用。例如.net框架中的TextBox,Label等是從WebControl繼承過來,采用基類的方式,,而SqlConnection和OracleConnection實現(xiàn)IDbConnection的接口,,這樣程序就可以使用IDbConnection接口去訪問不同類型的數(shù)據(jù)庫。 |
|