C 基礎 介面(二)

2022-01-20 18:19:42 字數 908 閱讀 9896

上文已經提到介面的基本知識,以及如何從物件導向的角度去認知介面與抽象類的聯絡和區別。本文將從另外的一些技術角度來繼續討論介面和抽象類的取捨問題。

首先,在c#中,乙個類僅可以繼承於乙個基類(可以是抽象類,也可以是普通的非密封類),但是它可以實現多個介面。因此,當某個類需要同時擁有多種不同的操作時,封裝這些操作的型別就不得不被定義為介面。例如,「學生」實體本身可以根據年齡來比較大小,同時它作為一種實體,還需要能夠被序列化/反序列化。此時,我們可以讓學生實體同時實現iserializable和icomparable介面以達到這樣的效果。嚴格的來說,並非所有實體都具有可比性,但從技術角度來講,實體都應該具備序列化/反序列化的能力。因此在這裡的案例中,我們應該定義乙個ientity的介面,使其實現iserializable介面,然後再讓學生實體同時實現ientity和icomparable介面。

其次,基類可以定義更多的資訊,當相似種類的物件有著共同的操作和/或屬性時,基類可以提供乙個預設值,而子類則可以根據需要來選擇是否過載/重寫這些預設值。這一點對於介面來說是無法辦到的。比如上文中我們給電池的正負極乙個預設值,直到最後定義「標準鎳氫電池」時,我們仍然沒有去過載這個值,而是一直沿用了定義在基類中的預設值,這在**重用上有著重要的意義。不僅如此,當我們修改了基類中某個成員的預設值時,所有繼承於該類的子類,如果沒有過載這個成員的話,那麼它們中相應成員的取值也會隨之變化,而這一變化並不需要對子類進行重新編譯。

再次,由於值型別都是繼承於valuetype,因此,無法再讓值型別繼承於其它型別,但值型別可以實現多個介面。當某一操作集合需要應用在值型別上時,只能將其封裝到介面。

至此,基本上對抽象類與介面的使用做了全面的討論,事實上也並沒有乙個嚴格的標準去區分什麼時候用抽象類、什麼時候用介面。我想,最關鍵也是最主要的依據仍然是前面一篇文章中所提到的,使用物件導向的語義去區分,而這就需要長期不斷的經驗積累,才能做出更加準確的理解與判斷。

C 基礎(二) 抽象類和介面

一 抽象類 含有abstract修飾符的類為抽象類,抽象類可以擁有自己的建構函式,但是不能直接通過new進行例項化,可以通過子類繼承,例項化子類的時候抽象類也會被例項化。抽象類可以包括方法也可以包括抽象方法,這是類所不能的。抽象方法只能宣告於抽象類中,且不能進行實現,派生類必須覆蓋它們。抽象類可以派...

C 超基礎 介面

1.什麼是c 介面 1 乙個c 介面是一些方法特徵的集合,但沒有方法的實現 public inte ce pci 2 c 介面中定義的方法在不同的地方被實現,可以具有完全不同的行為 class soundcard pci public void stop class networkcard pci ...

C語言基礎 二

迴圈 for int i 1 i 100 i 迴圈示例 1.for int i 0 i 9 i for int j 0 j i j printf n 2.倒三角for int i 5 i 0 i printf n 2.函式 void 自定義函式應該在主函式內呼叫 函式宣告 的位置必須在主函式之上 對...