在現實生活中我們發現,乙個類中的某個或某幾個方法是無法具體實現的。例如,我們前面使用的shape類中的畫圖draw()方法。當你不知道具體要畫什麼形狀,比如長方形或者三角形時,你怎麼可能實現乙個畫形狀的方法呢?在c#中,這樣的方法我們叫做抽象方法。乙個類如果有乙個或多個抽象方法,這個類就叫做抽象類。
用abstract修飾符來修飾- -個類時, 該類叫做抽象類;用abstract 來修飾-乙個方法時,該方法叫做抽象方法。
abstract returntype abstractmethod( [paramlist] ) ;
1)抽象類必須被繼承,抽象方法必須被重寫。
2)抽象類不能被直接例項化,因此它一般作為其他類的基類。
3)抽象方法只需宣告,而不需實現。定義了抽象方法的類必須是抽象類。
抽象方法就是在宣告方法時加上abstract關鍵字。宣告抽象方法時需要注意以下兩點:
抽象方法必須宣告在抽象類中。
宣告抽象方法時,不能使用virtual、static 和private修飾符。
抽象方法宣告引入了乙個新方法,但不提供該方法的實現。由於抽象方法不提供任何實際實現,因此抽象方法的方法體只包含乙個分號。
當從抽象類派生乙個非抽象類時,需要在非抽象類中重寫抽象方法,以提供具體的實現。重寫抽象方法時使用override關鍵字。
介面是一種特殊的抽象類,這種抽象類中指定實現該介面的類必須提供的成員,實現介面的類提供介面成員的實現。通過介面可以實現不相關類的相同行為,而不需要考慮這些類之,間的層次關係。介面特性如下:
1)通過介面可以指明多個類需要實現的方法。
2)介面類似於抽象基類: 繼承介面的任何非抽象型別都必須實現介面的所有成員。
3)不能直接例項化介面。
4)介面可以包含事件、索引器、方法和屬性。
5)介面不包含方法的實現。
6)類和結構可從多個介面繼承。
7)介面自身可從多個介面繼承。
如果類實現兩個介面,並且這兩個介面包含具有相同簽名的成員,那麼在類中實現該成員將導致兩個介面都使用該成員作為它們的實現;然而,如果兩個介面成員實現不同的功能,那麼這可能會導致其中乙個介面的實現不正確或兩個介面的實現都不正確。這時可以顯式地實現介面成員,即建立乙個僅通過該介面呼叫並且特定於該介面的類成員。顯式介面成員實現是使用介面名稱和乙個句點命名該類成員來實現的。
顯式介面成員實現中不能包含訪問修飾符、abstract. virtual. override 或static 修飾符。
顯式介面成員是屬於介面的成員,而不是類的成員,因此不能使用類物件直接訪問,只能通過介面物件來訪問。
抽象類和介面的區別:
抽象類和介面都包含可以由派生類繼承的成員,它們都不能直接例項化,但可以宣告其變數。如果這樣做,就可以基於多型性把繼承這兩種型別的物件指定給它們的變數,接著通過這些變數來使用這些型別的成員,但不能直接訪問派生類中的其他成員。
抽象類和介面的區別主要有以下幾點:
1、它們的派生類只能繼承乙個基類,即只能直接繼承乙個抽象類,但可以繼承任意多個介面。
2、抽象類中可以定義成員的實現,但介面中不可以。
3、抽象類中可以包含字段、 建構函式、析構函式、靜態成 員或常量等,但介面中不可以。
4、抽象類中 的成員可以是私有的(只要它們不是抽象的)、受保護的、內部的或受保護的內部成員(受保護的內部成員只能在應用程式的**或派生類中訪問),但介面中的成員必須是公共的。
密封類可以用來限制擴充套件性,如果密封了某個類,則其他類不能從該類繼承;如果密封了某個成員,則派生類不能重寫該成員的實現。預設情況下,不應密封型別和成員。密封可以防止對庫的型別和成員進行自定義,但也會影響某些開發人員對可用性的認識。
在c#中使用密封類時,如果類滿足如下條件,則應將其密封。
類是靜態類。
類包含帶有安全敏感資訊的繼承的受保護成員。
類繼承多個虛成員, 並且密封每個 成員的開發和測試開銷明顯大於密封整個類。
類是乙個要求使用反射進行快速搜尋的屬性,密封屬性可提高反射在檢索屬性時的效能。
1、密封類不能作為基類被繼承,但它可以繼承別的類或介面。
2、在密封類中不能宣告受保護成員或虛成員,因為受保護成員只能從派生類進行訪問,而虛成員只能在派生類中重寫。
3、由於密封類的不可繼承性,因此密封類不能宣告為抽象的,即sealed 修飾符不能與abstract修飾符同時使用。
抽象類 抽象方法
抽象類 1.類名前有abstruct修飾。有構造方法。在建立抽象類的子類的時候,還是會先建立抽象父類的物件的。2.抽象類不能例項化是指不能手動的new。抽象方法 1.抽象方法 沒有方法體且需要用abstruct關鍵字修飾 作用 需要改變的地方都應該是抽象。抽象方法只能存在於抽象類或介面中。2.有抽象...
抽象類,抽象方法
1 抽象類中可以有實現的方法。抽象方法必須在抽象類中。using system using system.collections.generic using system.linq using system.text namespace test 抽象類可以包含抽象屬性 public int age...
抽象類 抽象方法
抽象方法 使用 abstract修飾的方法,只有方法的宣告 沒有方法體 定義的是一種 規範 就是告訴子類必須要給抽象方法提供具體的實現 抽象類 包含抽象方法的類就是抽象類 通過abstract方法定義規範 然後要求子類必須定義具體實現 通過抽象類 我們就可以做到嚴格限制子類的設計 使子類之間更加通用...