1. 程式人生 > >C#學習——淺談介面、抽象類、介面繼承、類繼承

C#學習——淺談介面、抽象類、介面繼承、類繼承

引言: 

學習面嚮物件語言有一陣子了,聽也聽的多了,但是真正用起來的時候,還是有些陌生,這個Iworkspace,那個IworkspaceFactory還有次一級的很多,雖然我能夠知道他們之間的關係,但是在應用的時候就有點迷了,所以想梳理一下。 首先這塊內容,比如介面和抽象類的比較啊,什麼是繼承什麼是多型啊很多文章都講過,還有書本,有些也講的挺清楚、詳細,可以自己翻翻查查,我這主要就語意和用法上作主要分析。這塊東西想理清楚也不容易,筆者也是隻有一點點積累。程式碼自行思考,筆者下次補上。

  • 類?抽象類?
  • 介面?介面能例項化?
  • 異同?
  • 為什麼用介面?

抽象類

  • 首先它是一個類,我覺得可以理解為一個上層的類。類是一個具有相同特徵和行為的抽象,可以理解為一個複雜的資料型別。而抽象類(class 前加上 abstract)沒有指出行為的具體細節,而由他的子類去實現相應的行為。
  • 還是舉個最常用的例子,Animals——動物,可以定義成一個抽象類,狗、貓、小雞、小鳥,都可繼承自“動物”這個抽象類,抽象類中可以定義名稱、叫聲、食物這個共有的屬性,奔跑、叫等公有的方法,但是具體實現它是管不到的,有類自己去豐富。
  • 抽象類和類之間的關係語意上可以這樣描述:A屬於B,小鳥屬於動物,小狗屬於動物,飛機屬於交通工具……
  • 抽象類是用來繼承
    的。

繼承

繼承我這裡只想說一下它的作用和特點

  • 作用:共享程式碼,減少冗餘。這點很好理解,相信很多人都聽膩了。
  • 特點(缺點):很寶貴——只能繼承一次,這個也可以說是優點,也可以說是缺點,我個人覺得就分類上來講,一個東西可以歸到不同的類,但是採取同一標準可以使得系統更緊湊,比如說小鳥可以繼承動物、也可以繼承鳥類,但是鳥類繼承自動物然後小鳥再繼承自鳥類就可以滿足要求了。但是就行為來講,我們就必須要繼承自多個“類”才能達到目的,這就有了介面。

介面

  • 是指定一組函式成員而不實現成員的引用型別,其他型別和介面可以繼承介面;
  • 要我舉例的話就是小鳥和飛機都可以 Fly();
  • 介面從語意上可以視為能夠,具有某種功能,介面關注的是行為,定義了 能做什麼;
  • 介面是用來“實現”,稍後講區別會提到,介面內的所有屬性、方法必須被實現,所有的成員都是Public。

為什麼需要介面?

我的理解是:

  • 一是解決類的單一繼承的問題。還是用動物舉例,可以定義一個叫的介面,一個跑的介面,一個飛的介面,小狗既可以叫又可以跑,小鳥既可以飛又可以叫。
  • 二是解決跨繼承的多型問題。這又是什麼意思呢,我們知道類是成體系的,比如類庫,不同的很多類在c#中(最近AE窗體裡更多)都屬於各自的類庫,類庫裡都包含很多很多的關係,類之間的各種聯絡。假如交通工具和動物屬兩個不同的抽象類,為了做到程式碼共享,我可以定義一個Fly()介面,飛機和小鳥都可以繼承這個介面,各自不同的實現,這樣,就做到了跨繼承。

作用也就是上面的了,所以在實際當中,我們用到的很多事介面而不是抽象類,因為介面能夠更好的實現繼承的問題。

介面的繼承

  1. 基於上述介面的特點,不僅一個類可以繼承多個介面,同時介面與介面之間也可以繼承沒這樣就使得介面的使用十分靈活(但是我覺得也有點亂,也麻煩),在《C#本質論》中,(有興趣的圖書館好些有借),介面具“契約性”——方法集,我的理解是 介面可以理解為一個方法的系統化或者說模組化的大集合,比如下面這個圖可以看到,不同介面之間的繼承是有相對嚴格的層級關係的。
  2. 子(派生介面)介面繼承了父介面,那麼它就具有所有父介面提供的屬性和方法,同時也可以新增自己的新的方法屬性;

介面和抽象類和類的區別

其實我覺得沒有必要作太多的概念上的區分,沒什麼意思,很多書和別的地方都列出了一二三四點什麼的,有興趣的可以自己找找看看加深理解。

1、抽象類和類都是類,類可以看做一個自定義的更加複雜的資料型別(具有屬性、方法……),類例項化之後就稱為物件;

2、抽象類和介面都不能例項化,介面甚至可以視為特殊的抽象類,都不能通過new直接構造一個物件,這點可能有點奇怪,因為我們好像看到了類似的寫法:WHY?,所以介面可以例項化嗎?

IFeatureLayer pFL = new FeatureLayerClass();

這個我也很疑惑,但是經過一番蒐羅,這應該是一種省略的寫法:new了一個實現介面的匿名內部類,然後new得到匿名內部類的物件再向上轉型為它實現的介面(原始型別)換句話說——它例項化了一個匿名內部類,而這個類實現了這個介面。List也是一個介面,但是這個寫法我相信都用過:

List<String> list = new ArrayList<>();

所以就不難理解了,對於其內部的實現,筆者目前就沒有深究了,畢竟我們更多的還是以應用為主,需求驅動hh。

3、抽象類中可以有實現成員(非抽象方法),而介面中的方法只有宣告沒有實現;抽象類中可以有欄位,介面中不能有欄位,但可以有屬性(欄位和屬性的區別要是不懂就自己查查吧),而且介面所有的方法屬性都是Public;
4、抽象類,類只能單繼承基類,而類可以繼承多個介面;

關於類和介面方面的東西就先這樣反正之後有想到可以臨時新增,筆者自己理解的也不是很深,實踐出真知,多敲多碼吧,然後

Console.WriteLine("室友今天生日快樂!同時致謝今晚的大魚");

嘿嘿!

 

程式碼例項(之後有機會補補):