介面、抽象類別和面向介面的編程 介面本質
介面是對象和行為的做過抽象。
介面是一組規範,如果你擁有了這個介面,你就必須實現這些規範。從代碼上說就是你繼承了某個介面,你就必須實現這個介面的所有的方法。
介面作用
介面的最大作用就是隔離變化。當然這是通過類的多態來實現的。
例如:我們定義一個介面IRun如下:
public interface IRun
{
void Run ();
}
那麼所有繼承這個介面的類必須實現Run方法。類Car實現這個借口,那它就必須實現Run方法,我們就可以通過IRun介面讓Car跑起來。現在Car是通過4個輪子來跑的,假如過了幾十年,Car都是磁懸浮了,這時,我們只需要修改Car的具體實現就行了,而使用Car的類,不需要任何修改,它仍然通過調用介面IRun的Run方法,就能讓車跑起來。
再看現實中,你學會了開車,那麼幾乎所有的車你都會開,那是因為,這些車採用了相同的介面,即刹車,油門,方向盤等它們所在的位置,使用方法都是一樣的。 抽象類別
抽象類別和介面有很多相似點。單從功能來說,在很多情況下,我們可以互換它們來實現相同的功能。但從設計角度來看,它們還是不同的。比如:上面所說的IRun介面,它是一個行為的最高抽象,我們用抽象類別來代替介面就不好了。對於行為的最高抽象,用介面是最好的選擇。介面是制定的一組規則,而抽象類別是提高代碼的複用。對於它們的區別,還是來看個例子:
抽象類別為車,介面為跑、裝人和裝貨。客車和貨車為繼承抽象類別車的類。車實現了跑,而客車和貨車從車那裡繼承了這個方法,實現對代碼的複用。
面向介面的編程
我們在設計系統時,先將系統分解成多個模組,在這時,我們不會關心模組具體實現,重點是模組之間的協作,這些協作我們通過介面來定義。我們在設計模組時,會將模組分解為多個對象,這時,我們不會關心對象的具體實現,重點是對象之間的協作,這些協作我們通過介面來定義。我們可以看出,設計系統時,重點是設計這些介面。這就是面向介面的編程。
通過這種方式設計的系統,有很強的應對變化的能力。當你改變某個模組或者某個類時,只要不改變介面,其它的類和介面就不會受到影響。