為什么要定義interface
2010-03-02 11:03:43
通俗的講,就是為了降低耦合度。
一個很搞笑的例子:
看看下面的程序: 一個學校里邊,有兩種人:學生、老師。他們都要吃飯和睡覺。
------------------------------
public interface 人{
void 吃飯();
void 睡覺(); }
public class 學生 implements 人{
public void 吃飯(){
//去食堂吃飯 }
public void 睡覺(){
//回寢室睡覺 }
//其他特有方法,比如泡妞、打游戲 }
public class 老師 implements 人{
public void 吃飯(){
//回家吃飯 }
public void 睡覺(){
//回家睡覺 }
//其它特有方法,比如為生兒育女傳宗接代的歷史使命努力等不足為外人道的事情 }
public class 學校{
public void 開飯(人 ren){
ren.吃飯(); }
public void 放學(人 ren){
ren.睡覺(); } }
-----------------------------
這里就用到了里氏代換原則,"開飯()"和"放學()"的參數都是人,那么這個地方如果換成學生和老師肯定也可以。
人 a = new 學生();
學校.開飯(a); 學校.放學(a);
這樣執行的結果就是學生回寢室吃飯。
人 b = new 老師();
學校.開飯(b); 學校.放學(b);
這樣執行的結果就是老師回家吃飯。
為什么要這樣寫呢?這樣寫有什么好處呢? 我在開飯的時候完全可以直接調用"學生.吃飯();"、"老師.吃飯();"啊。 接着看。 有一天,學校里來了第三種人,家長。 家長既不是去寢室睡覺也不是回家睡覺,而是旅館睡覺,既不是去食堂吃飯也不是回家吃飯,而是去下館子。 這個時候學校這個系統該怎么處理呢? 如果原來沒有定義"人"這個接口那就麻煩啦,所有用到人的地方代碼都要改。 現在不一樣了,我可以直接定義一個類:家長,這個類實現人這個接口就可以了。
好,看代碼:
------------------------------
public class 家長 implements 人{
public void 吃飯(){
//下館子 }
public void 睡覺(){
//去旅館睡覺 }
//其它特有方法,比如會見老師,曉之以錢,動之以利等等,不一而足 }
-------------------------------
在調用的時候不需要修改任何代碼,還和原來一樣:
人 c=new 家長();
學校.開飯(c);
學校.放學(c);
輕松搞定家長的食宿問題!
這樣一來學校來再多的客人都沒關系啊,絕對可以應付自如,這也就是傳說中的可擴展性! 不知道初學者看到這里是不是能夠明白接口的作用。如果你還不明白,那么你把人這個接口去掉,自己寫一個學校開飯和放學的類,然后再加一個家長這個新新人類進去,看看你的代碼是什么樣子的,再想一下在人口這么多的中國,萬一哪天你的學校里來了成千上萬個新新人類你該怎么辦! 先聲明一下,這個案例可不是我想出來的~~ 然后我們就很好理解了,為什么用別人的東西要實現接口呢?很直接的一個原因是這樣一來,編程的復雜度就可能會大大降低了。
一個很搞笑的例子:
看看下面的程序: 一個學校里邊,有兩種人:學生、老師。他們都要吃飯和睡覺。
------------------------------
public interface 人{
void 吃飯();
void 睡覺(); }
public class 學生 implements 人{
public void 吃飯(){
//去食堂吃飯 }
public void 睡覺(){
//回寢室睡覺 }
//其他特有方法,比如泡妞、打游戲 }
public class 老師 implements 人{
public void 吃飯(){
//回家吃飯 }
public void 睡覺(){
//回家睡覺 }
//其它特有方法,比如為生兒育女傳宗接代的歷史使命努力等不足為外人道的事情 }
public class 學校{
public void 開飯(人 ren){
ren.吃飯(); }
public void 放學(人 ren){
ren.睡覺(); } }
-----------------------------
這里就用到了里氏代換原則,"開飯()"和"放學()"的參數都是人,那么這個地方如果換成學生和老師肯定也可以。
人 a = new 學生();
學校.開飯(a); 學校.放學(a);
這樣執行的結果就是學生回寢室吃飯。
人 b = new 老師();
學校.開飯(b); 學校.放學(b);
這樣執行的結果就是老師回家吃飯。
為什么要這樣寫呢?這樣寫有什么好處呢? 我在開飯的時候完全可以直接調用"學生.吃飯();"、"老師.吃飯();"啊。 接着看。 有一天,學校里來了第三種人,家長。 家長既不是去寢室睡覺也不是回家睡覺,而是旅館睡覺,既不是去食堂吃飯也不是回家吃飯,而是去下館子。 這個時候學校這個系統該怎么處理呢? 如果原來沒有定義"人"這個接口那就麻煩啦,所有用到人的地方代碼都要改。 現在不一樣了,我可以直接定義一個類:家長,這個類實現人這個接口就可以了。
好,看代碼:
------------------------------
public class 家長 implements 人{
public void 吃飯(){
//下館子 }
public void 睡覺(){
//去旅館睡覺 }
//其它特有方法,比如會見老師,曉之以錢,動之以利等等,不一而足 }
-------------------------------
在調用的時候不需要修改任何代碼,還和原來一樣:
人 c=new 家長();
學校.開飯(c);
學校.放學(c);
輕松搞定家長的食宿問題!
這樣一來學校來再多的客人都沒關系啊,絕對可以應付自如,這也就是傳說中的可擴展性! 不知道初學者看到這里是不是能夠明白接口的作用。如果你還不明白,那么你把人這個接口去掉,自己寫一個學校開飯和放學的類,然后再加一個家長這個新新人類進去,看看你的代碼是什么樣子的,再想一下在人口這么多的中國,萬一哪天你的學校里來了成千上萬個新新人類你該怎么辦! 先聲明一下,這個案例可不是我想出來的~~ 然后我們就很好理解了,為什么用別人的東西要實現接口呢?很直接的一個原因是這樣一來,編程的復雜度就可能會大大降低了。
Interface是用來定義類的,I並且是一個極度抽象的類,因為它允許人們通過創建一個能夠被向上轉型為多種基類的類型,來實現某種類似多種繼承變種的特性。
Interface接口僅包含方法的聲明,而不包含其實現。也就是說,實現接口的每個類都必須為該接口中聲明的每個方法提供實現。
Interface接口方法定義不能包含任何屬性(如 public 或 private),但在實現接口的類的定義中,已實現的方法必須標記為 public。
通過 extends 語句可以使用一個接口繼承多個接口,通過 implements 語句可以使用一個類繼承多個接口。