以前我一直沒有搞懂介面的工作流程,直到看了下面這篇文章:
很形象的介面的使用——針對初學者
黎克特制代換原則是什麼?聽起來很高深,不過我們也不是什麼學院派,就不講大道理了,直接拿個例子來說一下。
我們拿人和程式設計師舉個例子。人是乙個大類,程式設計師是繼承自人的子類。看看這句話:人需要吃飯。這句話我們把「人」換成「程式設計師」,就是:程式設計師需要吃飯,這樣換不會有什麼問題。現在我們反過來,把「程式設計師可以用計算機寫程式」裡邊的程式設計師換成「人」,就是:人可以用計算機寫程式。這樣就不一定正確了,否則問題可就大了,我們這些程式設計師只怕沒得飯吃了。
這個就是黎克特制代換原則:使用父類的地方肯定可以用它的乙個子類來替換掉,但是使用乙個子類的時候用它的父類來替換就不一定正確了。
好,現在我們回到程式設計裡邊來。
看看下面的程式:
乙個學校裡邊,有兩種人:學生、老師。他們都要吃飯和睡覺。
public inte***ce 人
public class 學生 implements 人
public void 睡覺()
...//其他特有方法
}public class 老師 implements 人
public void 睡覺()
...//其它特有方法
}public class 學校
public void 放學(人 ren)
}這裡就用到了黎克特制代換原則,"開飯()"和"放學()"的引數都是人,那麼這個地方如果換成學生和老師肯定也可以。
人 a = new 學生();
學校.開飯(a);
學校.放學(a);
這樣執行的結果就是學生回寢室吃飯。
人 b = new 老師();
學校.開飯(b);
學校.放學(b);
這樣執行的結果就是老師回家吃飯。
為什麼要這樣寫呢?這樣寫有什麼好處呢?
我在開飯的時候完全可以直接呼叫"學生.吃飯();"、"老師.吃飯();"啊。
接著看。
有一天,學校裡來了第三種人,家長。
家長既不是去寢室睡覺也不是回家睡覺,而是旅館睡覺,既不是去食堂吃飯也不是回家吃飯,而是去下館子。
這個時候學校這個系統該怎麼處理呢?
如果原來沒有定義"人"這個介面那就麻煩啦,所有用到人的地方**都要改。
現在不一樣了,我可以直接定義乙個類:家長,這個類實現人這個介面就可以了。
好,看**:
public class 家長 implements 人
public void 睡覺()
...//其它特有方法
在呼叫的時候不需要修改任何**,還和原來一樣:
人 c=new 家長();
學校.開飯(c);
學校.放學(c);
輕鬆搞定家長的食宿問題!
這樣一來學校來再多的客人都沒關係啊,絕對可以應付自如,這也就是傳說中的可擴充套件性!
不知道初學者看到這裡是不是能夠明白介面的作用。如果你還不明白,那麼你把人這個介面去掉,自己寫乙個學校開飯和放學的類,然後再加乙個家長這個新新人類進去,看看你的**是什麼樣子的,再想一下在人口這麼多的中國,萬一哪天你的學校裡來了成千上萬個新新人類你該怎麼辦!
**:
const用法總結(通俗易懂)
const的意思可以概括為 乙個不能被改變的普通變數 使得const在一定程度上提高程式的安全性和可靠性。const的幾種情況 int const size const int size 這兩條語句都是把size宣告為乙個整數,他的值不能被修改。可以在宣告的時候對他進行初始化,int const s...
numpy bincount 通俗易懂
bincount的用途很簡單,就是統計出乙個列表的各個元素的出現次數。例如輸入是 1,0,2,2,1,2,3,5 那麼輸出就是 1,2,3,1,0,1 這樣的結果可能並不是很直觀,可能依然會有同學會問為什麼會輸出這樣的結果。我們看看 假如我們把輸入的列表中的數字都統計一遍,形成乙個字典 key是列表...
通俗易懂的C STL
泛型程式設計 generic programming 是一種語言機制,通過它可以實現乙個標準的容器庫。像類一樣,泛型也是一種抽象資料型別,但是泛型不屬於物件導向,它是物件導向的補充和發展。泛型程式設計在c 上的應用主要體現在兩方面 函式模板和類模板。接下來舉個栗子 csdn部落格 anyway,模板...